从文本文件中行的特定部分创建文件夹

从文本文件中行的特定部分创建文件夹

我的父文件夹包含子文件夹。在每个子文件夹中,我都有如下文件夹:

Parent_folder
folder1
  folder_01_PAP_515151
  folder_02_PAPA_554651
  folder_03_PAPX_541313
  folder_04_PAP_654123
folder2
  folder_20_PAP_413513
  folder_02_PAPD_521354
  folder_055_PAP_685413
  folder_100_PAP_132312
folder3
  folder_11_PAPE_5313351
  folder_32_PAP_3513131
  folder_53_PAP_3213321
  folder_84_PAP_3313213

..

我使用以下命令列出包含“的所有文件夹和子文件夹肺动脉高压”并将其保存在文本文件“list.txt”中

find -type d -name "*_PAP_" > list.txt

输出如下:

  ./folder1/folder_01_PAP_515151
  ./folder1/folder_04_PAP_654123
  ./folder1/folder_20_PAP_413513
  ./folder2/folder_055_PAP_685413
  ./folder2/folder_100_PAP_132312
  ./folder3/folder_32_PAP_3513131
  ./folder3/folder_53_PAP_3213321
  ./folder3/folder_84_PAP_3313213

从此列表中,我想创建新文件夹,并且这些新文件夹的名称必须包含上一个列表中的“三位数字_PAP”部分,例如“055_PAP”、“32_PAP”、“53_PAP”...。新生成的文件夹列表必须是:

 01_PAP
 04_PAP
 20_PAP
 055_PAP
 100_PAP
 32_PAP
 53_PAP
 84_PAP

答案1

如果您有一个文件(名为list包含以下内容),并且您需要为文件中的每一行名称创建一个目录,其中目录名称只是./folder?/folder_.

./folder1/folder_01_PAP_515151
./folder1/folder_04_PAP_654123
./folder2/folder_055_PAP_685413
./folder2/folder_100_PAP_132312
./folder3/folder_32_PAP_3513131
./folder3/folder_53_PAP_3213321
./folder3/folder_84_PAP_3313213

然后你就可以做。

cat list | sed -r -e 's~[.]/folder[0-9]+/folder_~~' | xargs -I{} mkdir -p «prefix»{}

  • 我已将文件夹编号设置为一位或多位数字。
  • 将“前缀”留空,除非您需要前缀。

如果您只想重命名原始文件夹/目录,保留原始内容,那么您可以执行以下操作:

用这个测试一下。然后从重命名中删除-n,真正做到这一点。

find . -type d -name "*_PAP_" | rename -n 's~[.]/folder[0-9]+/folder_~~'

rename请注意,搜索模式与 for相同sedrename适用于文件名、sed适用于文件或流。

选项sed

  • -r使用扩展正则表达式(要使用的正则表达式的方言)。
  • -e下一个参数是表达式(sed 程序)。
  • 's~[.]/folder[0-9]+/folder_~~'表达式,加引号以便 shell 不解释它。

该表达式解释道:s~[.]/folder[0-9]+/folder_~~

  • s进行搜索并替换
  • ~分隔符将表达式分成几部分,您可以使用任何字符,但每次必须使用相同的字符。s~«search_for»~«replace_with»~«options»或使用不同的字符s@«search_for»@«replace_with»@«options»
  • «search_for» 正则表达式:
    • [.]一个点
    • /folder正如它所说的那样。
    • [0-9]一个数字。
    • +一个或多个前面的原子(数字)(因此一个或多个数字)。
    • /folder_正如它所说的那样。
  • «replace_with» 用什么来替换它,在这种情况下什么也没有。
  • 在这种情况下,请注意“选项”,其他包括i忽略大小写,g执行多次(不仅仅是找到第一个字符串)。

sed/语言rename虽然复杂,但功能非常强大。您将使用的主要部分是s(如此处所使用的),也许接下来y,这些都是值得学习的。您还必须学习正则表达式(也用于 grep 和其他命令)。

相关内容