find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
ここで説明したより複雑なスクリプトは試していませんが、Synology NASで機能する単一のコマンドラインバージョンはありません。rename
は利用できず、バリエーションの多くはfind
すでに名前が変更されたパスの古い名前に固執するため失敗失敗します(たとえば、パスの./FOO
後にが見つかった場合./FOO/BAR
、に名前./FOO
を変更して./foo
も引き続きリストされます)./FOO/BAR
ても、そのパスが無効になってもます) 。上記のコマンドは問題なく動作しました。
次に、コマンドの各部分について説明します。
find . -depth -name '*[A-Z]*'
これは.
、深さ優先検索(たとえば、の./foo/bar
前にリストされます)を使用して、現在のディレクトリからファイルを検索し(処理するディレクトリに変更します)、./foo
大文字を含むファイルのみを検索します。-name
フィルタは、ベースファイル名ではなくフルパスに適用されます。したがって、これはリストされます./FOO/BAR
が、されません./FOO/bar
。名前を変更したくないので、これで問題ありません./FOO/bar
。./FOO
ただし、名前を変更したいのですが、後でリストします(これ-depth
が重要な理由です)。
このコマンド自体は、最初に名前を変更するファイルを見つけるのに特に役立ちます。完全な名前変更コマンドの後にこれを使用して、ファイル名の競合またはエラーのためにまだ置換されていないファイルを検索します。
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
この部分は、によって出力されたファイルを読み取り、find
それらをmv
正規表現を使用コマンドで。-n
オプションは停止しsed
、入力を印刷するから、そしてp
検索と置換正規表現の出力置き換えるテキスト内のコマンド。
正規表現自体は2つのキャプチャで構成されています。最後の/(ファイルのディレクトリ)までの部分と、ファイル名自体です。ディレクトリはそのまま残りますが、ファイル名は小文字に変換されます。したがって、find
出力すると./FOO/BAR
、になりmv -n -v -T ./FOO/BAR ./FOO/bar
ます。の-n
オプションはmv
、既存の小文字のファイルが上書きされないようにします。この-v
オプションは、実行するmv
すべての変更を出力します(または、実行しない場合- ./FOO/bar
すでに存在する場合は、./FOO/BAR -> ./FOO/BAR
変更が加えられていないことに注意して、などの出力を行います)。ここ-T
で非常に重要です-ターゲットファイルをディレクトリとして扱います。これ./FOO/BAR
により./FOO/bar
、そのディレクトリがたまたま存在する場合に移動されないようになります。
これを一緒に使用して、find
実行されるコマンドのリストを生成します(実際に実行せずに何が行われるかを確認するのに便利です)
sh
これはかなり自明です。生成されたすべてのmv
コマンドをシェルインタープリターにルーティングします。あなたはそれをbash
好きなシェルに置き換えることができます。
ABCdef
、abcDEF
およびaBcDeF
?名前変更スクリプトは中止する必要がありますか、それとも警告して続行しますか?2. US-ASCII以外の名前の小文字をどのように定義しますか?そのような名前が存在する可能性がある場合、最初にチェックと除外のパスを実行する必要がありますか?3.名前変更操作を実行している場合