
1つ以上のtar.gzファイルを含むフォルダがあります。スクリプトの実行時に各ファイルの前に現在の日付を追加したいと思います。
たとえば、
2つのファイル名(このファイルは毎日生成されますが、名前は変わりません):
file1.tar.gz
file2.tar.gz
最初の日(2011-10-07)では、これら2つのファイルの名前は次のように変更されます。
2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz
翌日(2011-10-08)は次のように変更されました。
2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz
最後に、フォルダには次のファイルが含まれています。
2011-10-07_file1.tar.gz
2011-10-07_file2.tar.gz
2011-10-08_file1.tar.gz
2011-10-08_file2.tar.gz
1本のワイヤでこれを達成するには? 「名前の変更」コマンドを試しましたが、ファイルの前ではなくファイルの後にのみ日付を追加できます。
私のコード
cdate=`date +"%Y-%m-%d"`; rename .gz .gz.$cdate *.gz
答え1
明らかに重要なのは、すでに日付プレフィックスを持つファイルの名前を変更しないことです。
cdate=$(date +"%Y-%m-%d")
shopt -s extglob
for file in !([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*.gz); do
mv "$file" "${cdate}_$file"
done
答え2
file1.2011-10-07.2011-10-08.tar.gz
あなたのサンプルコードはあなたが望むものに似た結果を提供するかもしれません。
また、rename
これは標準的なコマンドではないため、用途によって異なります。
固定名の固定数のファイルしかないと言ったので、おそらく次の簡単なスクリプトを使用できます。
cdate=$(date +%Y-%m-%d)
for file in file1.tar.gz file2.tar.gz; do
mv "$file" "$cdate"_"$file"
done
答え3
ファイル名に下線が含まれていないと仮定すると、単純なbash 4+ソリューションを使用します。外部グローバル変数:
shopt -s extglob
today=$(date +%F)
for f in ./!(*_*).tar.gz; do mv "$f" "$today"_"$f"; done
より強力なバージョン:
shopt -s extglob
today=$(date +%F)
for f in ./!(????-??-??_*).tar.gz; do mv "$f" "$today"_"$f"; done
答え4
bashism(ループモードおよび/またはextglobモード)を使用せずに検索、切り取り、grep、およびxargsのみを使用すると、これを行うことができます。
find . -maxdepth 1 -type f | \
cut -c3- | \
grep -v '^\.' | \
grep -v '^[0-9][0-9][0-9][0-9]\-[0-9][0-9]-[0-9][0-9]_' | \
xargs -n 1 -I {} echo mv "{}" "`date +"%Y-%m-%d"`_{}"
echo
単に印刷する代わりに変更を適用するには、mvコマンドを削除してください。