web-dev-qa-db-ja.com

ファイル名を変更してスペースをアンダースコアに変更する

MS Windowsで作成されたファイル(mp3、wav、txt、doc)のロードがあり、名前にスペースが含まれています。例The file of whoever.doc

スペースをアンダースコアまたはドットに置き換えて、一度にすべての名前を変更したいと思います。

4
john

シェルはこれをかなり簡単に実行できます(ここでは、${var//pattern/replacement}演算子のksh93、zsh、bash、mksh、yashまたは(一部のビルド)busybox shを想定しています)。

for file in *.doc *.mp3 *.wav *.txt
do
  mv -- "$file" "${file// /_}"
done

*.doc ...グロブを変更して、名前を変更したいファイルに一致させます。

現在ファイル名にスペースが含まれている現在のディレクトリ内のすべてのファイルの名前を変更するには:

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

「clobber」チェックの追加を検討することもできます。

for file in *' '*
do
  if [ -e "${file// /_}" ]
  then
    printf >&2 '%s\n' "Warning, skipping $file as the renamed version already exists"
    continue
  fi

  mv -- "$file" "${file// /_}"
done

または、mv-iオプションを使用して、ファイルを上書きする前にユーザーにプロンプ​​トを表示します。

11
Jeff Schaller

sedを使用できます。例:

mv -i "${original_file}" "$(echo "${original_file}" | sed 's/ /_/g')"

ここに例があります。

名前にスペースを含むファイルを作成します。

touch "/tmp/test file with spaces"

ファイルの名前を変更します。

mv -i \
"/tmp/test file with spaces" \
"$(echo "/tmp/test file with spaces" | sed 's/ /_/g')"

ファイルの新しい名前は次のとおりです。

test_file_with_spaces

代わりにtrを使用して同じことを行うことができます。つまり、

mv -i "${original_file}" "$(echo "${original_file}" | tr ' ' _)"

または、Bashサブストリング置換を使用します。

mv -i "${original_file}" "${original_file// /_}"

または、renameコマンドを使用します。

rename "s/ /_/g" "${original_file}"
2
igal

何が言及されているのかは別にして、プログラム detox は興味深いかもしれません。このタイプの処理を行うために特別に設計されており、単なるスペース以外の多くのものを処理します。ファイル名に発音区別符号、括弧、またはその他の奇妙な要素がない場合、ディレクトリツリーの最上部で実行した場合、次のように実行する必要があります。

detox -r .

これはディレクトリの名前も修正するので、WindowsシステムのUsersディレクトリでは実行しないでください。そうしないと、問題が発生する可能性があります(Windowsでは、ユーザーディレクトリの特定のフォルダに特定の名前が必要です、これによりこれらのフォルダの名前が変更されます)。

2
rename s/\ /_/ *

名前を変更して空白をエスケープする必要があるかどうか、今は思い出せません。

(またはスワップ*(どんな拡張子でも。)

1
Joe Healey

もしrename s/\ /_/ *使用できませんrename -v ' ' '_' *

Qmvおよびvimを使用して、mp3txtwav、およびdocファイル名のすべてのスペースをアンダースコアに置き換えます。

qmv -f do --editor="vim -c '%s/ /_/g' -c 'wq'" \
    *.mp3 *.txt *.wav *.doc

qmvは renameutils の一部です。

0
Guildenstern