请帮助完成我的任务:
我有一个包含三个子文件夹的文件夹,每个子文件夹包含六个文件。每个子文件夹中有两个文件,文件名中带有 :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
命令的快捷方式。它可以比较数字、字符串并检查文件和目录的某些条件。