私の仕事を手伝ってください:
それぞれ6つのファイルを含む3つのサブフォルダがあるフォルダがあります。各サブフォルダには、名前に:nopmを含む2つのファイルがあります。
すべてのフォルダとそのサブフォルダを確認するには、シェルスクリプトを作成する必要があります。名前に:nopmを含むファイル名が含まれている場合は、名前からこの(:nopm)を削除する必要があります。 :nopmremovedに示すように、同じ名前の別のファイルが存在する場合は、それらのファイルを削除し、各対話をlog.txtというファイルに書き込む必要があります。
たとえば、
私はディレクトリを持っています:example_September
このディレクトリには3つのサブディレクトリがあります。
fruit/
car/
vegetable/
これら3つのディレクトリにはそれぞれ6つのファイルがあります。
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
[ ]
括弧はtest
bashコマンドのショートカットであることを覚えておいてください。数値、文字列を比較し、ファイルとディレクトリの特定の条件を確認できます。