ファイルの名前を変更するときにスペースを置き換えない


10

私はこのようにファイルの名前を変更しようとしています:

for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done

ただし、sedコマンドはすべてのスペースをに置き換えます_

sedコマンドを編集して、指定した文字と共にスペースを含めるにはどうすればよいですか?使ってみましたがうまくいき\sません...

EDIT:
たとえば、次のファイルtrip: hill、名前を変更する必要がありますtrip_ hillが、作るそれ以上のコマンドtrip__hill


一部のファイルをLinuxからMacに移動しています。しかし、何らかの理由でMacシステムがすべてのファイル名を読み取ることができないため、ファイルの名前を変更しようとしています。上記のコマンドにスペースを追加しても機能しません。そして、あなたは正しいです:私は指定されたものを除いてすべての文字を '_'で置き換えたいです。また、スペース文字を含める方法がわかりません。

指定した文字を除くすべての文字を「_」に置き換えようとしていることに注意してください。名前を変更するファイルに特定のパターンはないため、このperlコマンドを使用できません。

回答:


11

sed!でファイル名を解析しないでください。の出力はecho "$file"信頼できない場合があります。

を使用しrenameます。17.10では、最初にインストールする必要があります

sudo apt install rename

次に:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *

ノート

  • -nテスト後に削除して、実際にファイルの名前を変更します
  • -- ファイルが次で始まる場合のオプションの終わり -
  • [^-A-Za-z0-9_ .]置換したくない文字- -最初または最後に配置して、範囲を示しないようにします(文字どおりこれらの位置で扱われます)。
  • クラスにスペースを含めることができます
  • . 文字通りに扱われます(他の正規表現コンテキストでは、任意の文字を表し、エスケープする必要があります)。

これもsed

$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill

バージョンの末尾にスペースを追加すると、エラーが発生します。

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end

しかし-、最後に、それは動作します:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill

したがって、スペースを追加したときにハイフンの位置が問題を引き起こした可能性があります。しかし、ファイル名を解析しないようにというアドバイスは有効です。


このコマンドは正常に機能します。また、私が使用したコマンドの誤りを明確に特定しました。

2
ありがとうございました。sedを使用する場合は、スラッシュ「\」を使用する必要がないことに注意してください。これは、無視される文字のリストに「\」を追加するためです。

2
@latachこれはバックスラッシュですが、あなたの言うとおりです。テストして調べてみたところ.、文字クラスではリテラルであることがわかりました。ティル!
Zanna

2

シェルを使用することもできます。Bashのパラメーター拡張は置換を実行できます。

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

ダブルスラッシュは、それ以外のすべての一致を置き換えるように指示しますが、それ以外の構文は簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.