web-dev-qa-db-ja.com

日付がスタンプされたファイルの名前を前日に変更する

このルールに基づいて、ディレクトリ内のファイルの名前を連番に変更します。
ファイル名-[日付] => ファイル名-[前日]

たとえば、file20170329file20170328およびfile20170327は、file20170328file20170327およびfile20170326に名前変更されます。

100個のファイルがあるので、各ファイルの名前を個別に変更するよりも優れたトリックが必要です。

3
storm

次のスクリプト:

  • 各ファイルについて
  • Filenameが8より大きい場合(つまり、日付を保持できる場合)
  • basefilenameは、最後の8文字を除いたファイル名を保持します
  • TODAY-最後の8文字(日付)を保持します
  • YESTERDAY-$ TODAYの前日を8文字として保持します
  • 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
3
Yaron

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分以上かかります。しかし、それは機能します。

4
Zanna

または、GUIアプローチを好む場合は、krenameを試してください。多くのモジュールがあり、その中にカスタムスクリプトを記述できます。「日付システム関数」、「日付時刻プラグイン」が機能します Krename GUI for plugins

http://www.krename.net/home/

Sudo apt-get install krename
0
Sumeet Deshmukh