Bash 脚本在 Ubuntu 16.04 中递归重命名或删除文件、子目录和目录的文件名中的标点符号(?!)和字符串

Bash 脚本在 Ubuntu 16.04 中递归重命名或删除文件、子目录和目录的文件名中的标点符号(?!)和字符串

我是 Bash 脚本的新手,但我发现了一些解决方案,它们使用它来删除或重命名 Ubuntu 16.04 中目录和子目录中文件的文件名。例如,我的文件结构如下所示。因此,是FolderFruit,,,我们主目录的文件名。SubFolderApple???. SubFolder!!!KiwiSubFolder_Food_Banana是我们子目录的文件名。ListAppleFoodListKiwiFoodListBanana是我们各个文件的文件名。

>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' {} \; \)

除了第二个命令可以处理点之外,这两个命令基本上执行相同的操作。

相关内容