Find

查找文件名的一部分

  • September 23, 2015

請幫助我的任務:

我有一個包含三個子文件夾的文件夾,每個文件夾包含六個文件。每個子文件夾中有兩個文件,文件名中帶有 :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命令的快捷方式。它可以比較數字、字元串並檢查文件和目錄的一些條件。

引用自:https://unix.stackexchange.com/questions/231489