このルールに基づいて、ディレクトリ内のファイルの名前を連番に変更します。
ファイル名-[日付] => ファイル名-[前日]
たとえば、file20170329
file20170328
およびfile20170327
は、file20170328
file20170327
およびfile20170326
に名前変更されます。
100個のファイルがあるので、各ファイルの名前を個別に変更するよりも優れたトリックが必要です。
次のスクリプト:
mv
を使用する代わりに、/tmp/storage
フォルダーを作成しました。スクリプトはファイルをその場所にコピーします。この方法では、万が一両方のファイルのベースファイル名が同じでも、日付が1日で異なる場合、1つのファイルの名前を変更しても別のファイルが破損することはありません。注:スクリプトがcp
を実行できるようにするには、echo cp ...
行からecho
を削除する必要があります
mkdir -p /tmp/storage
for f in *
do
if [ "${#f}" -gt 8 ]; then
filebasename=${f::-8}
TODAY=${f: -8}
YESTERDAY=`date '+%C%y%m%d' -d "$TODAY-1 days"`
echo cp $f /tmp/storage/${f//$TODAY}$YESTERDAY;
fi
done
例:
$ ls *20*
aaa2hhh20170329 aaahhh20170329 xajds20170222 xajsxs20170224
スクリプト結果:
cp aaa2hhh20170329 /tmp/storage/aaa2hhh20170328
cp aaahhh20170329 /tmp/storage/aaahhh20170328
cp xajds20170222 /tmp/storage/xajds20170221
cp xajsxs20170224 /tmp/storage/xajsxs20170223
100個のファイルがある場合(そして、Ubuntuで一般的なPerl rename
にアクセスできる場合)、以下を使用できます。
for n in {100..1}; do rename -n "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done
さて、テストに-n
を使用すると、次のようなエラーが表示されます。
rename(file20170217, file20170216)
file20170218 not renamed: file20170217 already exists
file20170219 not renamed: file20170218 already exists
ただし、-n
なしで実行すると、ファイルは存在しないため、名前の変更は成功します。
for n in {100..1}; do rename "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done
100を超えるファイルがある場合は、範囲を{150..1}
などに増やす必要があります。
これは非常に遅いです。 100個のファイルの名前を変更するには、おそらく2分以上かかります。しかし、それは機能します。