我剛開始使用 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
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' {} \; \)
這兩個命令基本上執行相同的操作,除了第二個命令可以處理點之外。