Bagaimana cara mengganti nama file dengan spasi menggunakan shell Linux?

28

Saya menamai sejumlah file dengan spasi di dalamnya, dan saya ingin mengganti spasi dengan _. Namun, setiap kali saya menulis perintah di shell dengan nama file (misalnya Spring 2011), shell tidak mengenali file atau direktori.

Apa yang bisa saya lakukan? Apakah ada cara untuk menggunakan karakter unicode untuk spasi?

Phil Braun
sumber
untuk mengubah nama file N secara program, gunakan bashfor loop: lihat solusi saya di sini .
Trevor Boyd Smith

Jawaban:

33

Melarikan diri dari ruang, misalnya Spring\ 2011, atau menggunakan tanda kutip, misalnya 'Spring 2011'. Di masa depan, biasanya ide buruk untuk menggunakan nama file dengan spasi di dalamnya pada * NIX apa pun.

Jika sudah rename, Anda dapat menggunakan ini:

rename ' ' '_' [filenames...]
Rafe Kettler
sumber
1
Apakah Anda tahu apakah ada cara untuk melakukan ini untuk semua file sekaligus?
3
Mengapa itu ide yang buruk? Merupakan tanggung jawab programmer untuk menangani nama file dengan benar.
glenn jackman
1
@rafe, sebenarnya itu rawan kesalahan untuk tidak menangani nama file dengan benar di depan. Upaya ekstra datang ketika harus men-debug skrip ketika Anda hanya lupa mengutip variabel yang berisi nama file.
glenn jackman
3
Jawaban ini tampaknya tidak berfungsi (setidaknya pada Ubuntu 12.04 LTS). Jawaban dari unutbu bekerja dengan baik.
DNA
1
ini hanya melakukan ruang pertama untuk saya ... yang tidak membantu (saya punya renameversi 2.23)
Trevor Boyd Smith
30

Jika mesin Anda memiliki perintah rename , maka ini akan mengubah semua spasi untuk menggarisbawahi semua file / direktori di direktori kerja saat ini:

rename 's/ /_/g' *
unutbu
sumber
Dikonfirmasi bekerja di Ubuntu 12.04
anthonygore
1
tidak berfungsi untuk saya ... saya mendapat kesalahan "ganti nama: tidak cukup argumen". saya punya versi rename --version rename from util-linux 2.23.2.
Trevor Boyd Smith
24

Jika Anda tidak memiliki renameatau lebih suka menggunakan shell saja:

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

Rusak:

  • *\ *memilih semua file dengan spasi di namanya sebagai input untuk forloop.
  • Kutipan di sekitar "$f"penting karena kita tahu ada spasi dalam nama file dan jika tidak, akan muncul argumen 2+ mv.
  • ${f//str/new_str}adalah fitur substitusi string khusus-bash. Semua contoh strdiganti dengan new_str.
blahdiblah
sumber
2
ini bekerja tetapi bagi saya itu hanya menggantikan ruang pertama. jika saya menggunakannya for f in *\ *; do mv "$f" "${f// /_}"; doneberfungsi
billynoah
@ billynoah Tangkapan bagus, diperbarui.
blahdiblah
@blahdiblah Terima kasih banyak! Anda baru saja menyelamatkan saya begitu banyak waktu!
Gerilya
@blahdiblah solusi Anda jauh lebih elegan daripada solusi saya . kerja bagus. Saya tidak berpikir for loop glob akan bekerja ... jadi saya lakukan glob di luar for loop.
Trevor Boyd Smith
3

mv "Spring 2011.file" Spring_2011.file harus memberi tahu command-line untuk mengambil string yang dikutip sebagai input tunggal.

rockerest
sumber
Ini adalah satu-satunya jawaban yang bisa saya peroleh untuk bekerja.
blakeoft
1

Untuk secara terprogram mengganti nama file N, Anda dapat menggunakan bashloop sederhana .

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

Jika Anda memiliki kurang dari 5 nama file, maka Anda dapat secara manual mengetikkan semua nama file dan menggunakan renameperintah seperti yang disarankan oleh solusi di atas . Tetapi bagi saya ... Saya lebih suka solusi terprogram ... bahkan ketika hanya ada 4 file.

ps

jika Anda tidak terbiasa dengan BashEkspansi Parameter (yaitu ${filename// /_}), Anda dapat menggunakan renameperintah:

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
Trevor Boyd Smith
sumber