回答:
サブディレクトリ内のファイルの名前も変更する必要がありfind
、-execdir
述語がサポートされている場合は、次のことができます
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
@glenn jackmanに-depth
オプションを提案find
してくれて、私に考えさせてくれてありがとう。
一部のシステム(GNU / Linuxを含む)ではfind
、名前にスペースが含まれ、有効な文字を形成しないバイトシーケンスも含まれるファイルを見つけることができない場合があります(通常、文字セットでエンコードされた非ASCII文字の名前を持つメディアファイルでロケールとは異なります)。ロケールをC
(などLC_ALL=C find...
)に設定すると、問題が解決します。
-depth
オプションを使用すると、を取り除くことができますsort
。
-name '* *'
し-name '*_*'
、変更"${1// /_}"
します"${1//_/.}"
bash
のmanページで見つけることができます。
どのシェルでも、名前にスペースが含まれるファイルをループできます。bash、ksh、およびzshでは、スペースをアンダースコアに置き換えるのは簡単${VARIABLE//PATTERN/REPLACEMENT}
です。
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
Debian、Ubuntu、および派生製品では、Perlを使用できますrename
(他のディストリビューションにはとして別のプログラムが同梱されてrename
おり、そのプログラムはここでは役に立ちません)。
rename 's/ /_/g' *
必須のzshソリューション:
autoload zmv
zmv '(*)' '${1// /_}'
義務的なPOSIXソリューション:
for x in *" "*; do
y=$(printf %sa "$x" | tr " " "_")
mv -- "$x" "${y%a}"
done
s/…/…/g
は、すべての出現を置き換えることを意味します。マニュアルではあまり説明されていません。ディレクトリの名前を変更したい場合は、いくつかの方法があります。検索してみて(以前に見たことがあると思います)、見つからない場合は新しい質問をしてください。
_MG_blah.JPG
たIMG_blah.JPG
。
rename
これに使用できます(ここutil-linux
では、perl
1 ではなく1を想定しています)。
cd /path/to/dir
rename ' ' _ *\ *
これにより、名前に含まれるすべてのファイルとディレクトリのスペースが検索され、スペースがアンダースコアに置き換えられます。グロブファイルマッチングを使用するため、最初は正しいディレクトリにいる必要があります。
再帰的な一致を実行したい場合は可能ですが、rename
名前を変更したディレクトリ内のアイテムをキャッチするために数回実行する必要がある場合があります。
cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
rename
置き換えることにより、指定されたファイルの名前を変更します最初の発生をからのことで自分の名前にする。」これは自分の名前に単一のスペースを持つファイルに対してのみ動作しますので。(rename
ループで呼び出すこともできますが、実際にはここでは適切なツールではありません。)
別のオプションはmmv
、インストールされている場合です。
mmv \*\ \* \#1_#2
_
、複数のスペースを持つ名前は機能しません。
Debian / Ubuntuでは、CalebとGillesの回答に基づいて、これがファイルの名前を再帰的に変更するのに役立ちました。
cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **
注:名前を変更するファイルとその方法をプレビューするには、-n
スイッチをrename
次のように使用します。
rename -n 's/ /_/g' **
別の注意:設定globstar
により**
、すべてのサブディレクトリに一致するファイルが作成されるため、現在のディレクトリのみが必要な場合は、globstarを設定したり、の*
代わりに使用したりしないでください**
。
もう1つの注意:rename
検索語が複数回出現するファイルに対しては、コマンドを複数回実行する必要があります。
a b/c d
toの名前変更は機能しa_b/c_d
ません。まずに名前a b/c d
を変更しa b/c_d
、次にa b
に名前を変更する必要がありますa_b
)。
rename
コマンドを2回実行するということですか?
**
はドットファイルを除外し、シンボリックリンクを走査することに注意してください。
あなたが正規表現のフラッシュではない(私はそうではありません!)、kde用に設計されたアプリケーションを実行できる場合(kde-kデスクトップを使用するか、ライブラリをインストールしている場合)、krenameは素晴らしいグラフィカルユーティリティですあなたが前と後に見ることができます前に、あなたが変更にコミットします。オプションとしていくつかの単純な変換があり、正規表現もサポートしています。複数の順次変換を1つの名前変更に結合することもできるため、一度にすべてを実行する単一の複雑な変換を設計する必要はありません。また、名前の変更が適用された後、同じファイルの名前を変更し続けるオプションもあります。
それほど頻繁に使用することはありませんが、実際に使用すると、作業が迅速かつ簡単に完了します。ダウンロードしたさまざまなメディアファイルの名前を変更するときに非常に便利なため、システムでそれらを均一に管理できます。プログラムの使用中に参照できるように、krenameマニュアルを個別にダウンロードすると役立ちます。
find -maxdepth 1
OPが現在のフォルダーの操作について尋ねたとおりに実行する必要があります。