web-dev-qa-db-ja.com

Linuxシェルを使用してスペースを含むファイルの名前を変更するにはどうすればよいですか?

スペースを含む多数のファイルに名前を付けましたが、スペースを_に置き換えたいと思います。ただし、ファイル名(例:Spring 2011)を使用してシェルでコマンドを書き込むたびに、シェルはファイルまたはディレクトリを認識しません。

これについて私は何ができますか?スペースにUnicode文字を使用する方法はありますか?

31
Phil Braun

スペースを脱出します。 Spring\ 2011、または引用符を使用します。 'Spring 2011'。将来的には、* NIXでスペースを含むファイル名を使用することは、通常はお勧めできません。

renameがある場合、これを使用できます。

rename ' ' '_' [filenames...]
35
Rafe Kettler

マシンに rename コマンドがある場合、これにより、現在の作業ディレクトリのすべてのファイル/ディレクトリで、すべてのスペースがアンダースコアに変更されます。

rename 's/ /_/g' *
32
unutbu

renameがない場合、またはシェルのみを使用する場合:

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

故障:

  • *\ *は、forループの入力として、名前にスペースが含まれるすべてのファイルを選択します。
  • ファイル名にスペースがあることがわかっているため、"$f"を囲む引用符は重要です。それ以外の場合は、mvの2+引数として表示されます。
  • ${f//str/new_str}は、bash固有の文字列置換機能です。 strのすべてのインスタンスはnew_strに置き換えられます。
27
blahdiblah

mv "Spring 2011.file" Spring_2011.fileは、引用符で囲まれた文字列を単一の入力として受け取るようにコマンドラインに指示する必要があります。

3
rockerest

プログラムで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
1