web-dev-qa-db-ja.com

ファイル名の%20をスペースに置き換えますか?

名前にスペースを示すために%20を使用しているファイルのリストがあります。

現在、これらすべてを%20からスペース ""に変更するために次のことを試みています。

for x in *.txt
  do mv $x $(echo $x | sed -e 's/%20/ /')
done

それはニースを演じません。それはこれを吐き出します:

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

しかし、一部の画像をインポートするときに同じことを行い、正常に機能します。

for x in *_MG*.CR2
  do mv $x $(echo $x | sed -e 's/_MG/_IMG/')
done

1つは。TXTを使用しており、もう1つは。CR2を使用していることを忘れて、ここで完全に見落としているのは何ですか?

仕事用のラップトップを使用しているため、Homebrewを追加して追加のソフトウェアをインストールできないことに留意してください。そして、それはOS用のMac OS Xです。

4
Danijel-James W

Sedを使用する必要はありません。これは、パラメーター展開によって処理できます。

mv -- "$x" "${x//%20/ }"

FWIW、私はそれらの%20sをアンダースコア(または何か)に置き換えます。 I hateスペースを含むファイル名。しかし、ファイル名のスペースやその他の特殊文字を処理できるbashスクリプトの書き方を学ぶことは良いことだと思います。 :)

コメントでIzkataが言及しているように、パラメーターを引用することはveryが重要です! bash(および関連するシェル)内の二重引用符は、単なる文字列の区切り文字ではなく、単語分割を行わないことを示します。したがって、xにスペースを含むファイル名が含まれている場合、$xは2つの引数として扱われますが、"$x"は1つの引数として扱われます。単一引用符を使用する場合、パラメーターの展開を禁止するので、'$x'$xを含むリテラル文字列のみを生成しますが、これは通常は必要ありません。 :)

PS。コマンドラインで不足している--を提供してくれたMonsieur Chazelasに感謝します。 --は、引数リストのオプションの終わりを示します。これがないと、-で始まるファイル名がオプションとして解釈される可能性があります。

6
PM 2Ring

renameを使用し、%20をすべてのタイプのファイルのスペースに置き換えます。

$ rename -n 's/%20/ /g' *

File%20with%20in00.yA2 renamed as File with in00.yA2
File%20with%20in01.h9H renamed as File with in01.h9H
File%20with%20in02.CNR renamed as File with in02.CNR
File%20with%20in03.PuP renamed as File with in03.PuP
File%20with%20in04.js8 renamed as File with in04.js8
File%20with%20in05.KdZ renamed as File with in05.KdZ

OS Xでは、Perlベースの 名前変更ユーティリティ などの専用ツールを使用できます。人気のパッケージマネージャーを使用してインストールできます Homebrewbrew install rename

注:実際の名前変更を実行するには、-nオプションを削除してください。

8
αғsнιη

mvの出力にはおそらくスペースが含まれるため、次のようにforループでコマンドを実行しないように、結果を二重引用符で囲む必要があります。

mv abc%20def abc def

ここで、mvには引数が多すぎます。これらはusage:メッセージを提供するものです。

あなたがすべきことは:

for x in *_MG*.CR2
do 
  mv -- "$x" "$(printf '%s\n' "$x" | sed 's/_MG/_IMG/')"
done
7
Anthon