web-dev-qa-db-ja.com

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

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

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

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

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

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

-name "*:*"がなくても機能しますが、コマンド全体が高速になるため、変更する必要のあるファイル名のみをfindに渡すことをお勧めします。

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

  • find finds ...
    • ... /path/to/directoryディレクトリ内.。
    • ...すべてのファイル(-type f).。
    • ...一致する名前(-name "*:*")、.。
    • ...次に、renameを実行します(必要に応じて複数回)...
    • ... :-に置き換えるパターンを使用...
    • ...見つかったすべてのファイルで、一度に複数のファイル({} +)。

ノート:

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

互換性に関する注意

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

このマニュアル 非Perl renameの解決策は次のようになります。

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

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

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

5