终端:递归删除特定扩展名


1

我有一个文件夹,包含许多其他文件夹。

其中包含的一些文件夹(在任意深度)具有特定的扩展名,比方说.ext

TopFolder
+ Folder1
| + Folder11.ext
|   +Folder111
+ Folder2.ext

我想使用终端从任何子文件夹中的所有文件夹中删除该扩展名,以便它看起来像这样:

TopFolder
+ Folder1
| + Folder11
|   +Folder111
+ Folder2

我玩过find和xargs,但我无法让它工作。

Answers:


1

尝试这个:

$ find TopFolder -print
Topfolder
Topfolder/Folder1
Topfolder/Folder1/Folder11.ext
Topfolder/Folder1/Folder11.ext/Folder111
Topfolder/Folder2.ext
$ find TopFolder -name '*.ext' -print | while read i; do mv -v "$i" "${i%.ext}";done
$ find TopFolder
TopFolder
TopFolder/Folder1
TopFolder/Folder1/Folder11
TopFolder/Folder1/Folder11/Folder111
TopFolder/Folder2

第一个和最后一个查找只是为了显示前后层次结构。以下是中间人找到的,即实际工作的人:

$ find TopFolder -name '*.ext' -print

这会找到匹配模式的TopFolder中的所有内容'*.ext',即以.ext结尾的所有文件和目录,并打印每个文件的路径。如果要将其限制为仅限目录,请添加-type d

while read i; do

read i从标准输入读取到shell变量iwhile循环,直到read i返回false,它在文件结束时返回。正在find输出的是输出,read标准输入是输出find,所以readfind输出一次读取一行直到没有剩下。

mv -v "$i" "${i%.ext}"

这实际上是重命名。的-v是在那里只是让你可以看到发生了什么,你可以,如果你想离开它。"$i"是来源,如果路径中的任何元素$i包含空格,则引用。"${i%.ext}"是目的地,删除$i任何尾随.ext

done

这只是终止while循环。

请注意,这是在bash中,它应该在其他相当现代的shell中可行,但语法可能有点不同。


精彩的答案和精彩的解释; 非常感谢你!
fzwo 2015年

0

您可以使用查找内联脚本和参数扩展。

find . -type d -name '*.ext' -exec ksh -c 'for dir
    do mv "$dir" "${dir%.*}"
    done' _ {} +

这不适合我。
fzwo 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.