Find
查找文件名的一部分
請幫助我的任務:
我有一個包含三個子文件夾的文件夾,每個文件夾包含六個文件。每個子文件夾中有兩個文件,文件名中帶有 :nopm。
我需要創建一個檢查所有文件夾及其子文件夾的 shell 腳本。如果有任何文件名帶有 :nopm 作為名稱的一部分,則應從名稱中刪除此 (:nopm)。如果有另一個同名文件,如 :nopm 刪除,則應將其刪除,並且每次互動都應記錄到名為 log.txt 的文件中。
例如:
我有一個目錄:Example_September
在這個目錄中,我有三個子目錄:
fruit/ car/ vegetable/
這三個目錄各有六個文件:
fruit : apple pear banana melon grape :nopmlime car : fiat mercedes ferrari audi suzuki :nopmaudi vegetables : bean broccoli cabbage corn carrot :nopmgarlic In the directory fruit the script should rename :nopmlime to lime In the directory car the script should delete :nopmaudi
所有重命名和刪除都必須記錄到 .txt 文件,例如:
I remove the file(s) I rename the file(s)
我應該完成這樣的任務。你能幫忙修理這個嗎?
for if find /data/irm/Example_September -name :nopm: do mv filename1 filename2 echo I rename the file. elif rm file echo I remove the file. fi >> /data/irm/Example_September/log.txt \;
腳本註釋中的描述:
# assign log file name into variable log_file_name=script.log # iterate over all files in this folder an its subfolders for fname in $(find . -type f) do # check if current file name contains ":nopm" substring there_is_match=$(echo $(basename $fname) | grep ':nopm' | wc -l) # if yes value "1" will be assigned into there_is_match variable if [ $there_is_match -eq 1 ] ; then # cut off ":nopm" substring - I use perl instead of sed because I find its regex nicer then sed's newname=$(echo $fname | perl -p -e 's/:nopm//g') # check if file without substring already exists if [ -e $newname ] ; then # if yes delete it and log it rm -f $newname echo "Deleted file $newname" >> $log_file_name fi # rename file and log it mv $fname $newname echo "Renamed file $fname to $newname" >> $log_file_name fi done
請記住,
[ ]
括號是 bashtest
命令的快捷方式。它可以比較數字、字元串並檢查文件和目錄的一些條件。