我的父文件夹包含子文件夹。在每个子文件夹中,我都有如下文件夹:
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相同sed
。rename
适用于文件名、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 和其他命令)。