複数のファイル名を変更してファイルの前に日付を追加する

複数のファイル名を変更してファイルの前に日付を追加する

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コマンドを削除してください。

関連情報