Cara batch mengubah nama file (gambar) berdasarkan file CSV

11

Apa yang saya miliki dan ingin saya capai:

  1. Ada ribuan gambar dalam satu folder.

  2. Saya memiliki file CSV dengan kolom berikut:

    A: nama asli B: nama berganti nama

    Baris khas terlihat seperti ini:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"
    

    Saya dapat menghapus tanda kutip, itu tidak masalah.

  3. Sekarang saya ingin menggunakan aplikasi atau menjalankan skrip yang akan mencari semua gambar di kolom A dan mengubah nama mereka menjadi nama di kolom B (mis. Asli-1.jpg -> berganti nama-1.jpg).

Ada beberapa jawaban di sekitar, misalnya:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

Namun, ada beberapa skrip yang terlibat dan saya tidak yakin apakah semua skrip tersebut hanya memengaruhi folder tempat Anda menyimpan skrip atau mereka dapat mengganti nama semua file pada disk yang memenuhi kondisi tertentu. Tentu saja, yang terakhir perlu dihindari.

Apa yang saya cari adalah panduan sederhana cara mengubah nama file dan cara memilih folder dengan file.

Terima kasih sebelumnya.

ambil 2
sumber

Jawaban:

13

Ini seharusnya bekerja untuk Anda:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Penjelasan:

  • sed 's/"//g' files.csv : hapus tanda kutip
  • IFS=, : pisahkan input ,
  • while read orig new; do ... done: Ini akan membaca setiap baris input, membaginya pada nilai $IFS(di sini koma) dan menyimpan bidang 1 sebagai $origdan sisanya sebagai $new.
  • mv "$orig" "$new" : ini akan mengganti nama file seperti yang diminta.

Jika file Anda hanya berisi nama file (seperti orig.jpg) dan tidak ada jalur (tidak /home/take2/orig.jpgatau serupa), perintah di atas hanya akan mempengaruhi file di direktori Anda saat ini. Jadi, Anda perlu membuka terminal, cdke direktori target dan menjalankannya di sana.

Tes pertama:

Untuk menguji ini, Anda dapat melakukan dry run terlebih dahulu dengan mencetak perintah yang akan dijalankan tanpa benar-benar menjalankannya:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 
terdon
sumber
Hebat, ini dijelaskan lebih baik. :) Hanya untuk memeriksa sebelum menjalankannya - saya harus cd ke direktori target dan menjalankan baris ini atau saya perlu menyimpan baris itu sebagai example.sh dan kemudian jalankan "example.sh" dari terminal?
take2
@ take2 Anda bisa langsung menjalankan baris. Saya memperbarui jawabannya dengan cara untuk melihat apa yang akan dijalankan tanpa benar-benar mengubah file Anda, saya sarankan Anda melakukannya terlebih dahulu.
terdon
Hebat, itu berhasil! Hanya satu hal lagi - apakah itu peduli apa label kolom (mereka "asli" dan "baru" saat ini) atau hanya mengganti nama kolom A nama ke nama kolom B?
ambil 2
@ take2 label apa? Tidak, hanya perlu bidang yang dipisahkan koma pertama dan ganti nama menjadi yang kedua. Perhatikan bahwa jika ada lebih dari dua bidang, itu akan mengganti nama ke sisa baris. Selama file input Anda seperti apa yang Anda posting itu akan berfungsi seperti yang diharapkan.
terdon
Btw. Terminal juga menampilkan "mv: tidak bisa stat 'orig': Tidak ada file atau direktori", meskipun itu mengubah nama file.
ambil 2