我是 Bash 脚本的新手,但我发现了一些解决方案,它们使用它来删除或重命名 Ubuntu 16.04 中目录和子目录中文件的文件名。例如,我的文件结构如下所示。因此,是FolderFruit,,,
我们主目录的文件名。SubFolderApple???.
SubFolder!!!Kiwi
和SubFolder_Food_Banana
是我们子目录的文件名。ListAppleFood
,ListKiwiFood
和ListBanana
是我们各个文件的文件名。
>FolderFruit,,,
>> SubFolderApple??
>>> ListAppleFood.txt
>> SubFolder!!Kiwi
>>> ListKiwiFood.pdf
>> SubFolder_Food_Banana
>>> ListBanana.csv
目标是通过删除任何标点符号(例如,?和!)和出现在这些文件名中的字符串“Food”将上面的文件名更改为如下所示。
>FolderFruit
>> SubFolderApple
>>> ListApple.txt
>> SubFolderKiwi
>>> ListKiwi.pdf
>> SubFolderBanana
>>> ListBanana.csv
到目前为止,我设法编写了如下脚本,但不起作用。因此,我希望得到任何有经验的 Bash 或 Linux 用户的帮助。
shopt -s globstar for f in ./**; do sed 's/\([[:punct:]]\)/\\\1/g' "$f" done
答案1
除了使用 for 循环之外,您还可以find
使用-execdir
:
$ find -depth -mindepth 1 -type f,d -execdir \
rename 's/((Sub)?Folder|Food|List|[_,!?])//g' {} \;
如果我要详细说明该评论,重命名不会区分文件和目录,这使得它变得更加困难(保留 .ext)。在这种情况下,我认为最好将过程分为两个步骤,分别处理文件和目录。
$ find -mindepth 1 -depth \
\( -type f -execdir rename 's/(List|Food|[[:punct:]])(?![^.]*$)//g' {} \; \) \
-o \( -type d -execdir rename 's/((Sub)?Folder|Food|[[:punct:]])//g' {} \; \)
除了第二个命令可以处理点之外,这两个命令基本上执行相同的操作。