バックアップファイルの名前を変更する方法、バックアップバージョンをファイル名のサフィックスとして使用し、非表示にしないようにする方法

Aug 17 2020

私は多数の画像ファイルを扱ってきました。その一環として、1000以上のディレクトリに分散しているすべての画像ファイルタイプを1つに直接移動しました。まったく同じ名前の写真がたくさんありましたが、実際には別の写真でした。私はそうするために次のワンライナーを使用しました:

find . -type f -exec mv --backup=t '{}' /media/DATA-HDD/AllImages \;

同じ名前の画像が上書きされるのではなく、非表示のバックアップファイルが作成されるように、このようにしました。それは非常にうまくいきましたが、今私は解決する必要がある別の問題があります。

もちろん、私は次のようなタイルをたくさん持っています。

DSC_0616.NEF
DSC_0616.NEF.~1~
DSC_0616.NEF.~2~

私が探しているのは、コマンド(またはスクリプト)を実行することです。このコマンドは、ファイル名にサフィックスとしてバックアップ番号を追加することでこれらの隠しファイルの名前を変更し、。〜 [bu#]〜を削除して一意にしますファイル名と隠しファイルはありません。だから、そのように:

DSC_0616.NEF
DSC_0616_1.NEF
DSC_0616_2.NEF

私はこれを自分で試みるために研究しようとして数時間の大部分を費やしましたが、このトピックに関する私の知識の範囲内にある私がそこに到達するのを助けることができるものを本当に見つけることができません。

回答

1 Minty Aug 17 2020 at 09:57

上記のようにすべてに一貫した名前が付けられていることが確実である限り、一部の正規表現はシェルスクリプトを介してジョブを実行できます。

#!/bin/bash
# sets the file separator to be only newlines, in case files have spaces in them
IFS=$'\n' for file in $(find . -type f); do
        # parses just the number(s) between two tildes, and only at the end of the file
        number=$(echo $file | grep -Eo "~[0-9]+~$" | sed s/'~'/''/g) # if no match found, assume this is a "base" file that does not need to be renamed if [ "$number" == "" ]; then
                continue
        fi
        # parses the file name through "NEF", then deletes ".NEF"
        filename=$(echo $file |  grep -Eio "^.+\.NEF" | sed s/'\.NEF'/''/g )
        if [ "$filename" == "" ]; then continue fi mv -v $file $(echo "$filename"_"$number.NEF") # if anything went wrong, exit immediately if [ "$?" != "0" ]; then
                echo "Unable to move file $file"
                exit 1
        fi
done

これは、ディレクトリを下る場合にも機能します。スクリプトを配置し、プロジェクトのディレクトリツリーの最上部にある作業ディレクトリで実行するだけです。指定したようなサンプルファイルで実行する:

###@###:~/project$ find . -type f
./DSC_0616.NEF.~8~
./DSC_0616.NEF.~5~
./DSC_0616.NEF.~1~
./DSC_0616.NEF.~7~
./DSC_0616.NEF.~3~
./DSC_0616.NEF.~4~
./DSC_0616.NEF.~9~
./DSC_0616.NEF.~2~
./DSC_0616.NEF.~6~
./lower_dir/DSC_0616.NEF.~8~
./lower_dir/DSC_0616.NEF.~5~
./lower_dir/DSC_0616.NEF.~1~
./lower_dir/DSC_0616.NEF.~7~
./lower_dir/DSC_0616.NEF.~3~
./lower_dir/DSC_0616.NEF.~4~
./lower_dir/DSC_0616.NEF.~9~
./lower_dir/DSC_0616.NEF.~2~
./lower_dir/DSC_0616.NEF.~6~

スクリプトを実行した後:

###@###:~/project$ find . -type f
./DSC_0616_1.NEF
./DSC_0616_3.NEF
./DSC_0616_7.NEF
./DSC_0616_5.NEF
./DSC_0616_2.NEF
./DSC_0616_9.NEF
./DSC_0616_6.NEF
./DSC_0616_8.NEF
./DSC_0616_4.NEF
./lower_dir/DSC_0616_1.NEF
./lower_dir/DSC_0616_3.NEF
./lower_dir/DSC_0616_7.NEF
./lower_dir/DSC_0616_5.NEF
./lower_dir/DSC_0616_2.NEF
./lower_dir/DSC_0616_9.NEF
./lower_dir/DSC_0616_6.NEF
./lower_dir/DSC_0616_8.NEF
./lower_dir/DSC_0616_4.NEF