重複の可能性:
ファイルとディレクトリの名前を繰り返し変更します。
私はファイルやディレクトリが変わり、頻繁に変更される大規模な音楽ファイルディレクトリを持っています。私はファイルとディレクトリ名にスペースを含めないようにしたいので、すべて下線に置き換えます。
ホームディレクトリに移動し、次のコマンドを実行します。
$ find -type d -exec rename 'y/\ /\_/' {} \;
問題は、サブディレクトリがあるときにこのコマンドが失われたように見え、エラーを返すことです。したがって、次のディレクトリ構造がある場合:
...コマンドを実行すると、次のエラーが発生します。
$ find -type d -exec rename 'y/\ /\_/' {} \;
find: `./Test 02': No such file or directory
find: `./Test 01': No such file or directory
find: `./Test 03': No such file or directory
その結果、私のディレクトリ構造は次のようになります。サブディレクトリにはまだ空白があります。
コマンドを再実行すると、問題のディレクトリ名が変更されたように見えますが、次のエラーが発生します。
$ find -type d -exec rename 'y/\ /\_/' {} \;
find: `./Test_01/Test A': No such file or directory
find: `./Test_01/Test C': No such file or directory
find: `./Test_01/Test B': No such file or directory
最後にコマンドを再実行しましたが、エラーは発生せず、すべてのディレクトリとサブディレクトリの名前が必要に応じて指定されました。
明らかにこれを行うには、複数のサブディレクトリがあるときにコマンドを実行する必要があるため、退屈になる可能性があります。
このコマンドを一度だけ実行すると、すべてのディレクトリとサブディレクトリの名前が一度に変更されるようにするにはどうすればよいですか。
私の究極の目標は、これをBashスクリプトに含めて他の同様の管理コマンドで実行できるようにすることです。したがって、エラーを返さないか、追加の入力を要求しないようにする必要があります。また、重要な場合はUbuntu 12.04を実行しています。
答え1
何が起こるかは次のとおりです。
find
一致するディレクトリが見つかりました./Test 02
。find
rename
このディレクトリからコマンドを実行します。rename
Test 02
に名前が変更されましたTest_02
。find
ディレクトリに移動してみてくださいTest 02
。しかし、もはや存在しません。
この問題を解決する最も簡単な方法は、find
別の方法で作業するように指示することです。まず、ディレクトリ内で一致するものを見つけてから、ディレクトリ自体で一致するものを確認します。これがこの-depth
オプションの役割です。
を追加すると、-depth
別の問題が発生します。つまり、 を呼び出すfind
と、ディレクトリ名を に変更しようとします。というディレクトリがないため、この操作は失敗します。簡単な回避策は、ディレクトリ内で呼び出され、引数として渡されるオプションを使用することです。コマンドを終了するのではなく、1つのバッチに複数の引数を渡すと、作業を高速化できます。Test 01/Test A
rename 'y/\ /\_/' 'Test 01/Test A'
Test_01/Test_A
Test_01
-execdir
rename
Test 01
Test A
rename
+
;
-execdir
find -depth -name '* *' -type d -execdir rename 'y/ /_/' {} +
または、次の短いが不思議なzshコマンドを使用してください。
autoload zmv
zmv -Qw '**/*(/D)' '$1${2// /_}'
これzmv
機能パターンに従ってファイル名を変更します。ソースパターンは、**/*
すべてのサブディレクトリ()()のすべてのファイルを再帰的に一致させることです。これ*
**/
グローバル予選(オプションで有効-Q
)は、ディレクトリ(/
)のみが一致し、ドットファイル(D
)を含むことを意味します。この-w
オプションは、ソースパターンの各ワイルドカード文字の逆参照を生成します。置換は、最初のワイルドカード文字(の場合は最後の文字を含む)を$1
指定する一致で始まり、すべての空白文字をに置き換えるようにその項目(一致する内容)を変更します。コマンドが実行する操作を確認するオプションを追加すると、次のように深さを探索することを確認できます。**
/
${2// /_}
$2
*
_
-v
find -depth