コロンを含むすべてのファイル名を再帰的に検索し、コロンをダッシュ​​に置き換える必要がありますか?

コロンを含むすべてのファイル名を再帰的に検索し、コロンをダッシュ​​に置き換える必要がありますか?

多数のサブディレクトリを含む「main」ディレクトリがあり、これらのサブディレクトリのいくつかにはコロンを含むファイル名があります。Linux から GitHub リポジトリに「main」ディレクトリをアップロードしましたが、Windows ではファイル名にコロンを使用できないため、Windows マシンでこのリポジトリからプルしようとしたときに問題が発生しました。

Linux ターミナルを使用して、「メイン」ディレクトリ内のコロンを含むすべてのファイル名を再帰的に検索し、コロンをダッシュ​​ (-) 文字などに置き換えるにはどうすればよいでしょうか。

答え1

find /path/to/directory -type f -name "*:*" -exec rename -n 's/:/-/g' {} +

(このコマンドが機能しない場合は、この回答の最後にある互換性に関する注意事項を参照してください。)

これは、何が起こるかだけを印刷する基本的な安全バージョンです。実際にそれが起こるようにするには、-nオプションを削除します。

なくても動作しますが、変更する必要があるファイル名のみを渡すようにすると、コマンド全体が高速化されるため-name "*:*"便利です。find

それはこのように動作します:

  • find見つかります...
    • .../path/to/directory監督の中で...
    • ...すべてのファイル (-type f)...
    • ...一致する名前(-name "*:*")で、...
    • ...その後、実行しますrename(必要な場合は複数回)...
    • ...:に置き換えるパターンは次のとおりです...-
    • ...見つかったすべてのファイルに対して、一度に複数のファイルに対して ( {} +)。

ノート:

  • このコマンドはディレクトリの名前を変更しません。これは仕様によるものです。
  • ファイル名に通常とは異なる文字 (改行など) が含まれていると、名前の変更が機能しない場合があります。そのようなファイル名はおそらく存在しないため、これは正式なメモです。

互換性に関する注意

renameこのソリューションでは、Debian、Ubuntu で利用可能なパッケージのPerl スクリプトを使用します。他のディストリビューションでは、から入手renameできる場合があります。renameutil-linux

このマニュアルPerl 以外の場合の解決策は次renameのようになると示唆しています:

find /path/to/directory -type f -name "*:*" -execdir rename -n ':' '-' {} +

(再度、正しいと思われる場合は削除してください。) ただし、これはテストしていません。ファイル名の最初のコロンのみが置き換えられると思います。回避策は、コロンがなくなるまで-nコマンドを繰り返すことです ( なし-n、 あり)。-v

あるいは、次のアーカイブからPerlスクリプトを入手することもできます。このサイト(現在File-Rename-0.20.tar.gz、スクリプトの名前は ですrename.PL)。以下も参照してください。この質問

関連情報