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.名前変更操作を実行している場合