Bagaimana cara mengganti nama banyak file dengan menggunakan baris perintah?

103

Salah satu cara saya dengan cepat mengganti nama file di Windows adalah

F2 > Rename > Tab (to next file) > Rename ...

Tetapi di Ubuntu / Nautilus, saya tidak bisa menabrak file berikutnya. Tetapi di Linux, saya pikir harus ada alternatif baris perintah.

Namun, kadang-kadang, saya mungkin ingin kontrol lebih besar tentang cara mengganti nama file tertentu. Dalam hal ini, mungkin lebih baik untuk dapat menabrak file berikutnya

Jiew Meng
sumber
1
Bisakah Anda mendefinisikan "lebih banyak kontrol"? Tidak yakin apa yang sebenarnya Anda tanyakan ..
Dang Khoa
Saya pikir pertanyaan ini tidak dijawab. Apa yang Anda minta (F2 dan kemudian melompat dalam mode F2 ke file berikutnya) saat ini tidak tersedia saya pikir di Nautilus.
don.joey

Jawaban:

189

Saya menggunakan renamesemua waktu. Ini cukup sederhana, tetapi mudah-mudahan Anda tahu regex dasar:

rename "s/SEARCH/REPLACE/g"  *

Ini akan menggantikan string SEARCHdengan REPLACEdi setiap file (yaitu, *). The /gberarti global, jadi jika Anda memiliki SEARCH_SEARCH.jpg, itu akan berganti nama REPLACE_REPLACE.jpg. Jika Anda tidak memilikinya /g, itu akan dilakukan hanya sekali, dan dengan demikian sekarang dinamai REPLACE_SEARCH.jpg. Jika Anda ingin tidak peka huruf besar kecil, tambahkan /i(mungkin itu, /giatau /igpada akhirnya).

Dengan ekspresi reguler, Anda dapat melakukan lebih banyak hal.

Perhatikan bahwa ini renameadalah perintah prename(alias Perl rename), yang mendukung ekspresi reguler Perl lengkap. Ada lagi renameyang menggunakan pola, dan tidak sekuat itu. prenamedulu diinstal secara default di Ubuntu (bersama dengan Perl), tetapi sekarang Anda mungkin harus melakukan:

sudo apt install rename

Berikut ini beberapa contoh:

Awalan

Tambahkan :

rename 's/^/MyPrefix_/' * 
  • document.pdf diganti namanya menjadi MyPrefix_document.pdf

Hapus :

Anda juga dapat menghapus string yang tidak diinginkan. Katakanlah Anda memiliki 20 file MP3 bernama like CD RIP 01 Song.mp3dan Anda ingin menghapus bagian "CD RIP", dan Anda ingin menghapusnya dari semuanya dengan satu perintah.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 untuk 01 Song.mp3

Perhatikan ruang ekstra di '^CD RIP ', tanpa spasi semua file akan memiliki ruang sebagai karakter pertama dari file tersebut. Perhatikan juga, ini akan berfungsi tanpa ^karakter, tetapi akan cocok CD RIP di bagian mana pun dari nama file. The ^jaminan itu hanya menghilangkan karakter jika mereka adalah awal file.

Akhiran

Tambahkan :

rename 's/$/_MySuffix/' *
  • document.pdf diganti namanya menjadi document.pdf_MySuffix

Ubah :

rename 's/\.pdf$/.doc/' *

akan berubah Something.pdfmenjadi Something.doc. (Alasan backslash adalah, .adalah karakter wildcard di regexp jadi .pdfcocok qPDFsedangkan \.pdfhanya cocok dengan string yang tepat .pdf. Juga sangat penting untuk dicatat, jika Anda tidak terbiasa dengan BASH, Anda harus meletakkan backslash dalam tanda kutip! Anda mungkin tidak menghilangkan tanda kutip! atau gunakan tanda kutip ganda, atau bash akan mencoba menerjemahkannya. Untuk bash \. dan "\." sama dengan .(tapi tanda kutip ganda dan garis miring terbalik digunakan, misalnya "\ n" untuk baris baru, tetapi karena "\."bukan urutan mundur yang valid, itu bash diterjemahkan ke dalam .)

Sebenarnya, Anda bahkan dapat melampirkan bagian-bagian string dalam tanda kutip, bukan keseluruhan: 's/Search/Replace/g'sama dengan s/'Search'/'Replace'/gdan s/Search/Replace/guntuk BASH. Anda hanya perlu berhati-hati tentang karakter khusus (dan spasi).


Saya sarankan menggunakan -nopsi ketika Anda tidak positif Anda memiliki ekspresi reguler yang benar. Ini menunjukkan apa yang akan diganti namanya, lalu keluar tanpa melakukannya. Sebagai contoh:

rename -n s/'One'/'Two'/g *

Ini akan mencantumkan semua perubahan yang akan dilakukan, seandainya Anda tidak menaruh -nbenderanya di sana. Jika terlihat bagus, tekan Upuntuk kembali, lalu hapus -ndan tekan Enter(atau ganti dengan -vuntuk menampilkan semua perubahan yang dibuatnya).

Catatan : Versi Ubuntu di atas 17.04 tidak disertakan renamesecara default, namun masih tersedia di repositori. Gunakan sudo apt install renameuntuk menginstalnya

Mat
sumber
Bagaimana saya akan memiliki akhiran "dinamis". Suka 001 - 010 dll. Kemungkinan?
Jiew Meng
Hmm .. Saya mencoba menulis sesuatu tetapi tidak berhasil. Sebagian besar karena, ketika saya menambahkan 1 hingga 001, itu menambah 2, bukan 002. Kalau tidak, saya bisa menggunakan varaibles untuk memegang posisi angka, lalu menambahkannya. Juga, saya baru ingat, sebelum saya tahu tentang perintah rename, ini adalah apa yang saya lakukan untuk menambahkan:for f in *; do mv -v "$f" "prependThis$f"; done
Matt
2
@jiewmeng Ya. Gunakan (?:\.[0-9]{3})$dalam pola Anda, itu akan cocok dengan semua ekstensi file 3 digit dalam grup pasif. Contoh: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Lihat lembar contekan regex ini .
sergio91pt
@ sergio91pt itu adalah lembar contekan regex yang bagus. Tapi tentang apa ini? Harus perl - tetapi tidak dapat menemukan catatan seperti itu di sana.
Adobe
@Adobe Ini yang umum untuk "perl berbasis regex". Lihatlah catatan tentang tanda + dan kolom tentang Kelas Karakter POSIX.
sergio91pt
21

Coba pyrenamer .

Ini tidak terintegrasi dengan nautilus, tetapi menyelesaikan pekerjaan. Ini ulasannya.

Thunar (bagian dari XFCE) juga memiliki pemain yang dapat Anda jalankan secara terpisah.

Renamer massal Thunar

RolandiXor
sumber
2
terima kasih telah menyebutkan fungsionalitas Thunar. Jika Anda memiliki Thunar - pilih file dalam folder dan tekan F2.
Maks
9

Tampaknya ada proyek di launchpad yang disebut nautilus-renamer . Anda dapat menginstalnya dengan menjalankan make installsetelah Anda mengunduh skrip dan membukanya. Tampaknya memiliki beberapa fungsi atau jika Anda tahu beberapa pemrograman mungkin Anda bisa meningkatkannya dengan kebutuhan Anda karena itu hanya skrip python.

masukkan deskripsi gambar di sini

sagarchalise
sumber
8

Pada baris perintah, untuk mengganti nama file tunggal perintahnya sederhana

mv file1.txt file2.txt

Jika Anda ingin melakukannya dalam batch, Anda mungkin ingin melakukannya melalui skrip. Jika Anda memberikan rincian lebih lanjut, saya atau orang lain mungkin dapat menyiapkannya untuk Anda. Yang mengatakan, skrip untuk menambahkan barang ke file mungkin terlihat seperti ini:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

Bergantung pada bagaimana tepatnya Anda perlu mengubah nama hal-hal ini kemungkinan akan diubah, misalnya jika Anda memiliki aturan penamaan ulang khusus untuk diikuti. (Secara pribadi saya akan melakukan ini melalui skrip Perl karena bash-foo saya tidak terlalu bagus, tapi itu hanya saya.)

Perhatikan bahwa saya mendapatkan pemisahan nama file dan ekstensi dari pertanyaan yang diajukan sebelumnya .

Dang Khoa
sumber
7

Jika Anda ingin melakukannya tanpa baris perintah, sama seperti apa yang Anda lakukan di Windows, gunakan tombol panah kanan dan bukan tombol tab . Ini akan memilih file berikutnya seperti halnya tab di Windows.

Rafał Cieślak
sumber
Itu tidak sama: Anda masih perlu ENTER untuk menyelesaikan penggantian nama, tombol panah untuk pindah ke file berikutnya, dan F2 untuk mengganti nama itu. TAB melakukannya dalam 1 langkah setelah Anda mengganti nama file.
MestreLion
@MestreLion Tetapi sangat mirip dengan algoritma yang dijelaskan dalam pertanyaan dan tidak memerlukan perangkat lunak tambahan maupun operasi baris perintah. Agak ramah-pengguna.
Rafał Cieślak
Benar, Anda adalah satu-satunya jawaban yang setidaknya mencoba pendekatan yang sama dengan pertanyaan awal. Dan kebenaran yang menyedihkan adalah bahwa Nautilus tidak memiliki fungsi seperti itu. Anda dapat F2 untuk mengubah nama, tetapi hanya itu. Tidak ada TAB untuk secara otomatis memindahkan Anda ke file berikutnya dalam mode ganti nama.
MestreLion
7

Tidak benar-benar pertanyaan yang sama seperti Bagaimana cara mengganti nama banyak file sekaligus? tapi saya akan menyarankan program yang sama yang saya sarankan dalam jawaban itu: qmv .

qmv adalah alat yang berguna dari paket renameutils. Ini memungkinkan Anda untuk menggunakan editor teks favorit Anda untuk mengganti nama file. Dikombinasikan dengan kekuatan vim, Anda memiliki utilitas penggantian nama yang sangat baik.

Saya biasanya memanggilnya seperti qmv -f dodi dir di mana saya ingin mengganti nama banyak file. Atau jika saya ingin mengganti nama secara rekursif qmv -R -f do.

Setiap kali saya perlu mengganti nama banyak file, saya selalu kembali ke qmv (dan vim).

http://www.nongnu.org/renameutils/

dempa
sumber
Saya baru saja mencoba ini berdasarkan saran Anda. Ini benar-benar alat yang paling luar biasa jika Anda menggunakan vim!
ste_kwr
3

Jika satu-satunya pilihan yang cocok adalah mengganti nama file secara manual, cara terbaik untuk melakukannya adalah menggunakan vidir(dalam moreutilspaket):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Contohnya


Mengganti nama file secara selektif

Konten direktori kerja saat ini:

.
├── bar
├── baz
└── foo

Jalankan vidir, ganti nama file di baris yang berisi nama file yang ingin Anda ganti namanya; tekan CTRL+ Odan CTRL+ X:

tangkapan layar3

.
├── bar.bak
├── baz.old
└── foo.new

Berpindah nama file secara selektif

Konten direktori kerja saat ini:

.
├── bar
├── baz
└── foo

Konten file direktori kerja saat ini:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Jalankan vidir, ganti angka-angka di baris yang berisi nama file yang ingin Anda ganti; tekan CTRL+ Odan CTRL+ X:

tangkapan layar4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Menghapus file secara selektif

Konten direktori kerja saat ini:

.
├── bar
├── baz
└── foo

Jalankan vidir, hapus baris yang berisi file yang ingin Anda hapus; tekan CTRL+ Odan CTRL+ X:

tangkapan layar2

.
└── baz
kos
sumber
2

Saya menggunakan krename. Ini adalah aplikasi GUI. Itu bisa membaca tag mp3 dan sebagainya.

Itu ada sebagai aplikasi terpisah serta bagian dari Krusader.

Ada juga renameskrip - yang merupakan bagian dari instalasi perl standar (Anda mungkin sudah menginstalnya). Lihat dengan man rename.

Adobe
sumber