Linux - Mengganti spasi pada nama file


Jawaban:


172

Ini harus melakukannya:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

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" *

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.


4

Jika Anda menggunakan bash:

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

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

2

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

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

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

1

Kutip variabel Anda:

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

Hapus "echo" untuk melakukan rename yang sebenarnya.


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.


Ini tidak menjawab pertanyaan itu.
amit


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.