スペースを含む多数のファイルに名前を付けましたが、スペースを_
に置き換えたいと思います。ただし、ファイル名(例:Spring 2011
)を使用してシェルでコマンドを書き込むたびに、シェルはファイルまたはディレクトリを認識しません。
これについて私は何ができますか?スペースにUnicode文字を使用する方法はありますか?
スペースを脱出します。 Spring\ 2011
、または引用符を使用します。 'Spring 2011'
。将来的には、* NIXでスペースを含むファイル名を使用することは、通常はお勧めできません。
rename
がある場合、これを使用できます。
rename ' ' '_' [filenames...]
マシンに rename コマンドがある場合、これにより、現在の作業ディレクトリのすべてのファイル/ディレクトリで、すべてのスペースがアンダースコアに変更されます。
rename 's/ /_/g' *
rename
がない場合、またはシェルのみを使用する場合:
for f in *\ *; do mv "$f" "${f// /_}"; done
故障:
*\ *
は、for
ループの入力として、名前にスペースが含まれるすべてのファイルを選択します。"$f"
を囲む引用符は重要です。それ以外の場合は、mv
の2+引数として表示されます。${f//str/new_str}
は、bash固有の文字列置換機能です。 str
のすべてのインスタンスはnew_str
に置き換えられます。mv "Spring 2011.file" Spring_2011.file
は、引用符で囲まれた文字列を単一の入力として受け取るようにコマンドラインに指示する必要があります。
プログラムでN個のファイルの名前を変更するには、単純なbash
forループを使用できます。
#!/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
ファイル名が5つ未満の場合は、すべてのファイル名を手動で入力し、上記のようにrename
コマンドを使用できます solution が推奨します。しかし、私にとっては... 4つのファイルしかない場合でも、プログラムによる解決策を好む...
pS.
Bash
のパラメータ拡張に慣れていない場合(つまり、${filename// /_}
)rename
コマンドを使用できます:
if ((0)); then
mv -v "${filename}" "${filename// /_}"
else
rename ' ' '_' "${filename}"
fi