現在のディレクトリのすべてのファイル名で、ある文字を別の文字に置き換える方法は?


41

現在のフォルダ内のすべてのファイル/サブディレクトリの名前を変更するにはどうすればよいですか?

たとえば、スペースを含む多くのファイルとサブディレクトリがあり、すべてのスペースをアンダースコアに置き換えたいとします。

File 1
File 2
File 3
Dir 1
Dir 3

名前を変更する必要があります

File_1
File_2
File_3
Dir_1
Dir_3

回答:


36

サブディレクトリ内のファイルの名前も変更する必要があり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...)に設定すると、問題が解決します。


find -maxdepth 1OPが現在のフォルダーの操作について尋ねたとおりに実行する必要があります。
カレブ

1
findの-depthオプションを使用すると、を取り除くことができますsort
グレンジャックマン

@glenn jackman:ありがとう、私の解決策が間違っていたことがわかりました。
enzotib

2
に変更-name '* *'-name '*_*'、変更"${1// /_}"します"${1//_/.}"
enzotib

1
@kroiz:「パターン置換」と呼ばれます。bashのmanページで見つけることができます。
エンゾチブ

34

どのシェルでも、名前にスペースが含まれるファイルをループできます。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

「名前変更」コマンドの最後の「g」はどういう意味ですか?マニュアルには表示されませんでした。
JulianLai

ディレクトリのみの名前を変更する方法は?ファイル名を変更したくありません。
JulianLai

@JulianLai s/…/…/gは、すべての出現を置き換えることを意味します。マニュアルあまり説明されいません。ディレクトリの名前を変更したい場合は、いくつかの方法があります。検索してみて(以前に見たことがあると思います)、見つからない場合は新しい質問をしてください。
ジル「SO-悪であるのをやめる」

すばらしい...これはすべての名前をに変更するのに役立ちまし_MG_blah.JPGIMG_blah.JPG
アビナッシュダッシュ

13

renameこれに使用できます(ここutil-linuxでは、perl1 ではなく1を想定しています)。

cd /path/to/dir
rename ' ' _ *\ *

これにより、名前に含まれるすべてのファイルとディレクトリのスペースが検索され、スペースがアンダースコアに置き換えられます。グロブファイルマッチングを使用するため、最初は正しいディレクトリにいる必要があります。

再帰的な一致を実行したい場合は可能ですが、rename名前を変更したディレクトリ内のアイテムをキャッチするために数回実行する必要がある場合があります。

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!

2
rename置き換えることにより、指定されたファイルの名前を変更します最初の発生をからのことで自分の名前にする。」これは自分の名前に単一のスペースを持つファイルに対してのみ動作しますので。(renameループで呼び出すこともできますが、実際にはここでは適切なツールではありません。)
ジル「SO-悪であるのをやめる」

2

別のオプションはmmv、インストールされている場合です。

mmv \*\ \* \#1_#2

これは、最初のスペースをaに変更するだけで_、複数のスペースを持つ名前は機能しません。
ジル 'SO-悪であるのをやめる'

おっと、あなたは正しい。混乱させて申し訳ありません。
glglgl

1

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 dtoの名前変更は機能しa_b/c_dません。まずに名前a b/c dを変更しa b/c_d、次にa bに名前を変更する必要がありますa_b)。
ステファンシャゼル

@Stephane:同じrenameコマンドを2回実行するということですか?
マルクスシャイト

まあ、スペースのあるネストされたレベルのディレクトリがあるのと同じくらいです。理想的には、最初にディレクトリの深さを走査し、受け入れられたソリューションのようにファイルのベース名のみを変換する必要があります。また、bash **はドットファイルを除外し、シンボリックリンクを走査することに注意してください。
ステファンシャゼル

0

あなたが正規表現のフラッシュではない(私はそうではありません!)、kde用に設計されたアプリケーションを実行できる場合(kde-kデスクトップを使用するか、ライブラリをインストールしている場合)、krenameは素晴らしいグラフィカルユーティリティですあなたが前と後に見ることができます前に、あなたが変更にコミットします。オプションとしていくつかの単純な変換があり、正規表現もサポートしています。複数の順次変換を1つの名前変更に結合することもできるため、一度にすべてを実行する単一の複雑な変換を設計する必要はありません。また、名前の変更が適用された後、同じファイルの名前を変更し続けるオプションもあります。

それほど頻繁に使用することはありませんが、実際に使用すると、作業が迅速かつ簡単に完了します。ダウンロードしたさまざまなメディアファイルの名前を変更するときに非常に便利なため、システムでそれらを均一に管理できます。プログラムの使用中に参照できるように、krenameマニュアルを個別にダウンロードすると役立ちます。

http://www.krename.net/

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