Bash 腳本在 Ubuntu 16.04 中遞歸地重新命名或刪除檔案、子目錄和目錄的檔案名稱中的標點符號 (?!) 和字串

Bash 腳本在 Ubuntu 16.04 中遞歸地重新命名或刪除檔案、子目錄和目錄的檔案名稱中的標點符號 (?!) 和字串

我剛開始使用 Bash 腳本,但我發現了一些解決方案,可以使用它來刪除或重命名 Ubuntu 16.04 中目錄和子目錄中的檔案的檔案名稱。例如,我的文件結構如下所示。所以,這FolderFruit,,,是我們主目錄的檔名。SubFolderApple???. SubFolder!!!KiwiSubFolder_Food_Banana是我們的子目錄的檔名。ListAppleFoodListKiwiFood、 和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

find您可以使用with而不是使用 for 循環-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' {} \; \)

這兩個命令基本上執行相同的操作,除了第二個命令可以處理點之外。

相關內容