以下は、定義されたパス内のすべてのファイルを変更するスクリプトです。
#!/bin/bash
FILES=/path/to/files/*
for f in $FILES
do
[some_command_to_make_changes_into_file] $f > tmp_$f; mv tmp_$f $f
done
コードは最初はうまく動作します。問題は、このスクリプトを2回目または3回目の実行時にすべてのファイルを再選択することです。どうやってできるか 進まなかった最後の実行ですでに処理されているすべてのファイルはありますか?ファイル名やパスを変更できません。
ベストアンサー1
ファイルを「処理済み」とマークできます。
#!/bin/bash
TAG="done"
FILES=/path/to/files/*
for f in $FILES
do
case "$f" in
*.$TAG) # process mark-files
echo "# TAG-FILE=$f"
b=`echo $f | sed "s/\.$TAG\$//"` # get base file of the mark-file
echo "# FILE=$b"
if [ ! -f "$b" ] ; then
echo "# TAG-FILE REMOVE"
rm $f # remove mark-file without base file
file
continue # do not process mark-files themselves
;;
esac
if [ -f "$f.TAG" ] ; then
echo "# FILE=$f"
echo "# TAG-FILE PRESENT"
continue # mark-file present - skip processing
fi
echo "# FILE=$f"
echo "# TAG-FILE ABSENT => PROCESSING"
# [some_command_to_make_changes_into_file] $f > tmp_$f; mv tmp_$f $f
echo "# PROCESSED"
touch "$f.$TAG" # create mark-file
if [ -f "$f.TAG" ] ; then
echo "# TAG-FILE CREATED"
else
echo "# TAG-FILE CREATION FAILED!"
exit
fi
done
可能な改善点:タグファイルを別のディレクトリに保存できます。