web-dev-qa-db-ja.com

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

現在のフォルダー内のすべてのファイル/サブディレクトリの名前をどのように変更しますか?

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

File 1
File 2
File 3
Dir 1
Dir 3

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

File_1
File_2
File_3
Dir_1
Dir_3
43
NobbZ

サブディレクトリ内のファイルの名前も変更する必要があり、find-execdir述語をサポートしている場合、次のことができます

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

find-depthオプションを提案して、考えさせてくれた@glenn jackmanに感謝します。

一部のシステム(GNU/Linuxを含む)では、findは名前にスペースが含まれているファイルや、有効な文字を形成しないバイトのシーケンス(通常は、ロケールとは異なる文字セットでエンコードされたASCII文字)。ロケールをCに設定すると(LC_ALL=C find...のように)、問題が解決します。

37
enzotib

どのシェルでも、名前にスペースが含まれているファイルをループできます。スペースをアンダースコアで置き換えるのは、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

これにはrenameを使用できます(ここではPerlではなくutil-linuxからのものを想定しています):

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

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

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

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

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

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

Debian/Ubuntuでは、CalebとGillesの回答に基づいて、ファイル名を再帰的に変更するためにこれが機能しました。

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

注:名前が変更されるファイルとその方法をプレビューするには、rename-nスイッチを使用します。

rename -n 's/ /_/g' **

もう1つの注意:globstarを設定すると、すべてのサブディレクトリで**一致ファイルが作成されるため、現在のディレクトリのみが必要な場合は、globstarを設定しないか、*の代わりに**を使用しないでください。

もう1つ注意点:renameコマンドは、検索語が複数出現するファイルに対して複数回実行する必要があります。

1
Markus Pscheidt

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

私はそれを頻繁に使用しませんが、使用すると、本当に迅速かつ簡単に仕事が完了します。ダウンロードしたさまざまなメディアファイルの名前を変更するときに非常に便利なので、システム上でそれらを一元的に管理できます。プログラムを使用しているときに参照できるように、krenameマニュアルを個別にダウンロードするのに役立ちます。

http://www.krename.net/

0
Joe