Bagaimana cara menambahkan teks ke nama file secara massal?

44

Katakanlah saya memiliki direktori yang penuh dengan .mdfile yang semuanya bernama berbagai hal. Katakanlah saya ingin menambahkan "teks" ke depan setiap nama file. Jadi misalnya: berkas a.md, b.mddan c.mdakan menjadi test - a.md, test - b.md, dan test - c.md.

Bagaimana saya melakukannya melalui baris perintah?

Jesse Atkinson
sumber

Jawaban:

60

Satu liner yang dapat dengan mudah diketik langsung dari terminal:

for f in *.md; do mv "$f" "test - $f"; done

Atau ditulis ulang pada baris yang terpisah alih-alih menggunakan titik koma:

for f in *.md
do
    mv "$f" "test - $f"
done

Eksposisi

Sintaks for(dalam sh):

for NAME [in WORDS ... ] ; do COMMANDS; done

Di sini, NAMEis kami fdan kami WORDSsemua file dalam direktori yang cocok saat ini *.md. Jadi variabel $fakan diganti dengan setiap pencocokan file *.md.

Jadi untuk a.md:

mv "$f" "test - $f"

menjadi

mv "a.md" "test - a.md"

Kutipan itu penting karena setiap nama file $fmungkin mengandung spasi. Kalau tidak, mvakan berpikir setiap kata adalah file yang terpisah. Misalnya, jika tidak ada tanda kutip, dan ada file yang dipanggil Foo Bar.md, itu akan diterjemahkan sebagai:

mv Foo Bar.md test - Foo Bar.md

yang tidak akan bekerja sesuai keinginan. Tetapi dengan membungkus $ftanda kutip, masuk akal:

mv "Foo Bar.md" "test - Foo Bar.md"

Memperhatikan sintaks for, Anda juga bisa mengganti nama subset dari semua *.mdfile dengan menamai masing-masing secara eksplisit:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Atau menggunakan ekspansi shell:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
QuasarDonkey
sumber
Inilah yang perlu saya lihat. Terima kasih!
Ryan
11

Jika Anda memiliki prename...

prename 's/^/test - /' *.md

Menggunakan perintah shell biasa:

for file in *.md; do
    mv "$file" "test - $file"
done
grawity
sumber
Bagaimana saya mendapatkan prename?
Ga
Tampaknya sudah diinstal sebelumnya untuk saya di Ubuntu 16.04 LTS. Sudahkah Anda mencoba manajer paket Anda (mis., sudo apt-get install)?
Orion751
5

mmv1 , 2 juga merupakan alat yang sangat bagus untuk tugas seperti itu, diterapkan pada pekerjaan saat ini, itu akan menjadi

mmv '*.md' 'test - #1.md'

Tentu saja, jika Anda hanya ingin menambahkan "test -" ke a.md, b.md dan c.md, tetapi bukan a1.md, sesuatu seperti

mmv '?.md' 'test - #1.md'

akan lebih tepat.

Saya benar-benar dapat menyarankannya, terutama jika Anda memiliki banyak masalah seperti itu.

Jika Anda juga mencari antarmuka grafis, coba gprename .

Claudius
sumber
5

Alih-alih menggunakan for for, yang akan gagal pada spasi kecuali Anda mendefinisikan ulang variabel IFS, saya akan merekomendasikan menggunakan loop sementara yang dikombinasikan dengan find. Berikut ini akan berfungsi ketika dijalankan dari direktori yang sama dengan file

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

baris "basename" ada di sana sehingga find akan mencetak nama file saja - tanpa komponen path yang akan membuat operasi penggantian nama terputus.

Fred Clausen
sumber
2

Saya tahu ini benar-benar terlambat, tetapi jika orang lain mencari sesuatu seperti ini, maka ini berhasil bagi saya:

rename '' 'name -' *.md
nullptr
sumber
1
sederhana dan lurus ke depan
user13743
0

Jika zshtersedia, Anda dapat menggunakan zmv:

autoload zmv
zmv -w '*' 'test - $1'

Anda dapat menguji perintah dengan:

zmv -wn '*' 'test - $1'
  • -n berarti dry-run, yaitu hanya menunjukkan apa yang akan terjadi.
  • -w secara implisit menempatkan tanda kurung di sekitar wildcard, membuat referensi bekerja.
Thor
sumber
0

Dalam bash, menambahkan "Teks bergantungan -" ke semua file di folder:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
Osiris
sumber
Ini adalah cara penulisan yang sangat panjangfor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby