Cara mengganti nama file cadangan, menggunakan versi cadangannya sebagai akhiran untuk nama file dan membuatnya tidak lagi tersembunyi

Aug 17 2020

Saya telah bekerja dengan banyak file gambar. Bagian dari ini adalah memindahkan semua jenis file gambar yang tersebar di 1000+ direktori menjadi satu secara langsung. Ada banyak gambar yang memiliki nama yang sama persis, tapi memang gambar yang berbeda. Saya menggunakan satu baris berikut untuk melakukannya:

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

Saya melakukannya dengan cara ini sehingga gambar apa pun yang memiliki nama yang sama akan dibuatkan file cadangan tersembunyi, bukan ditimpa. Ini bekerja dengan sangat baik, tetapi sekarang saya memiliki masalah lain yang harus saya selesaikan.

Sekarang, saya, tentu saja, memiliki banyak ubin yang seperti berikut:

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

Yang ingin saya lakukan adalah menjalankan perintah (atau skrip), yang akan mengganti nama file tersembunyi ini dengan menambahkan nomor cadangan sebagai sufiks ke nama file, dan menghapus. ~ [Bu #] ~ untuk membuatnya unik nama file dan tidak tersembunyi. Jadi, seperti ini:

DSC_0616.NEF
DSC_0616_1.NEF
DSC_0616_2.NEF

Saya telah menghabiskan sebagian besar waktu beberapa jam mencoba meneliti untuk mencoba ini sendiri, tetapi tidak dapat benar-benar menemukan apa pun yang dapat membantu saya mencapainya yang ada dalam bidang pengetahuan saya tentang topik tersebut.

Jawaban

1 Minty Aug 17 2020 at 09:57

Selama Anda yakin semuanya dinamai secara konsisten seperti yang Anda jelaskan di atas, beberapa ekspresi reguler dapat menyelesaikan pekerjaan melalui skrip shell:

#!/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

Ini juga akan berfungsi untuk turun melalui direktori, cukup tempatkan skrip dan jalankan dengan direktori kerja Anda di bagian atas pohon direktori proyek Anda. Berjalan dengan file contoh seperti yang Anda berikan:

###@###:~/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~

setelah menjalankan skrip:

###@###:~/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