查找文件名的一部分

查找文件名的一部分

请帮助完成我的任务:

我有一个包含三个子文件夹的文件夹,每个子文件夹包含六个文件。每个子文件夹中有两个文件,文件名中带有 :nopm。

我需要创建一个 shell 脚本来检查所有文件夹及其子文件夹。如果存在任何包含 :nopm 作为名称一部分的文件名,则应从名称中删除此 (:nopm)。如果存在另一个同名文件,如 :nopmremoved 中所示,则应将其删除,并且应将每次交互记录到名为 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 \;

答案1

脚本注释中的说明:

 # 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命令的快捷方式。它可以比较数字、字符串并检查文件和目录的某些条件。

相关内容