Linux - Mengganti spasi pada nama file

96

Saya memiliki sejumlah file dalam sebuah folder, dan saya ingin mengganti setiap karakter spasi di semua nama file dengan garis bawah. Bagaimana saya bisa mencapai ini?

Mithun Sreedharan
sumber

Jawaban:

172

Ini harus melakukannya:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
neesh
sumber
Ini tidak berhasil untuk saya. Itu mengklaim file identik ada (dengan nama file yang salah). Misal mencoba rename 1 - foo.jpgdan folder saya sudah ada 1.jpgdi dalamnya.
byxor
3
Saya menemukan backticks agak sulit untuk dibaca ketika mereka mendekati kutipan. Hal yang sama tetapi lebih mudah dibaca adalahfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron
Catatan: Ini dijalankan dari DALAM direktori yang nama filenya ingin Anda perbarui. Atau, Anda dapat mengubah *ke PATH_TO_YOUR_DIRECTORY.
CFitz
73

Saya lebih suka menggunakan perintah 'rename', yang menggunakan regexes gaya Perl:

rename "s/ /_/g" *

Anda dapat melakukan uji coba dengan bendera -n:

rename -n "s/ /_/g" *
DF.
sumber
3
ini akan berfungsi jika Anda memiliki penggantian nama gaya perl dan bukan yang lebih sederhana redhat / fedora
David Dean
9
versi fedora akanrename " " "_" *
David Dean
4
renametidak tersedia di OSX itu muncul.
Etienne Low-Décarie
Di macOS 10.12.3, renametersedia.
Sung Cho
1
@DavidDean Perubahan nama pada Arch Linux hanya akan menggantikan kejadian pertama (sangat tidak nyaman untuk file / direktori dengan banyak spasi). Ini memiliki sintaks yang sama dengan fedora, jadi saya curiga mereka mungkin sama. Tapi perl-rename bisa dipasang.
prosoitos
15

Gunakan sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Jika Anda ingin mencobanya sebelum menarik pelatuk, ganti saja mvke echo mv.

DigitalRoss
sumber
4

Jika Anda menggunakan bash:

for file in *; do mv "$file" ${file// /_}; done
Wakil Presiden Murali
sumber
ketika saya mencoba, saya mendapat mv: ketika memindahkan banyak file, argumen terakhir harus berupa direktori. Coba mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv - help 'untuk informasi lebih lanjut.
Mithun Sreedharan
Sekali lagi kesalahan mv: argumen file hilang Coba mv --help' for more information. mv: missing file argument Try mv --help 'untuk informasi lebih lanjut. mv: argumen file hilang Coba mv --help' for more information. mv: missing file argument Try mv --help 'untuk informasi lebih lanjut.
Mithun Sreedharan
@ levislevis85: Thx, tidak tahu itu.
Soulmerge
4

Bagaimana jika Anda ingin menerapkan tugas ganti secara rekursif ? Bagaimana Anda melakukannya?

Nah, saya sendiri baru menemukan jawabannya. Bukan solusi paling elegan, (juga mencoba mengganti nama file yang tidak sesuai dengan kondisi) tapi berhasil. (BTW, dalam kasus saya, saya perlu mengganti nama file dengan '% 20', bukan dengan garis bawah)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done
javipas.dll
sumber
2

Coba sesuatu seperti ini, dengan asumsi semua file Anda adalah .txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
Amir Afghani
sumber
2
dapatkan kesalahan di bawah tr: dua string harus diberikan saat menerjemahkan mv: argumen file hilang Coba `mv --help 'untuk informasi lebih lanjut.
Mithun Sreedharan
2
Agin error tr: terlalu banyak argumen Coba tr --help' for more information. mv: missing file argument Try mv --help 'untuk informasi lebih lanjut.
Mithun Sreedharan
2

Ini solusi lainnya:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. menggunakan awk untuk menambahkan tanda kutip di sekitar nama file
  2. menggunakan sed untuk mengganti ruang dengan garis bawah; mencetak nama asli dengan tanda kutip (dari awk); lalu nama yang diganti
  3. xargs mengambil 2 baris sekaligus dan meneruskannya ke mv
yoogottamk
sumber
1

Kutip variabel Anda:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Hapus "echo" untuk melakukan rename yang sebenarnya.

anjing hantu74
sumber
Itu menggemakan perintah mv dengan benar, tetapi tidak benar-benar mengganti nama file!
Mithun Sreedharan
menghapus gema menghasilkan kesalahan seperti mv: tidak bisa stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': Tidak ada file atau direktori mv: tidak bisa stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': Tidak ada file atau direktori seperti itu
Mithun Sreedharan
Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP Jum 14 Agustus 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan
1

Cara termudah untuk mengganti string (karakter spasi dalam kasus Anda) dengan string lain dalam Linuxmenggunakan sed. Anda bisa melakukannya sebagai berikut

sed -i 's/\s/_/g' *

Semoga ini membantu.

Desta Haileselassie Hagos
sumber
Ini tidak menjawab pertanyaan itu.
amit
0

Saya yakin jawaban Anda ada di Ganti spasi di nama file dengan garis bawah .

Arthur Frankel
sumber
1
Meskipun ini secara teoritis dapat menjawab pertanyaan tersebut, akan lebih baik jika menyertakan bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Bill the Lizard
0

Untuk mengganti nama semua file dengan .pypenggunaan ekstensi, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Output sampel,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
akilesh raj
sumber