2013-09-25 7 views
6

私のLinuxボックスには、Windowsで無効と見なされる文字を含むファイルが含まれています(http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx)。プロジェクトには複数のフォルダにまたがるファイルが10,000以上あり、これらのファイルのパスを特定します。Linuxの名前に不正なウィンドウ文字が含まれているファイルを探します。

私は違法/予約文字のそれぞれについて、find . -name "*\?*"をすることができますが、私は特定したら< > : "/\ | ? *

を含むすべてのファイルを見つけるための簡単な方法があり、私はそれぞれからそのようなすべての文字を削除したいですこれらのファイル。

find . -name '*[<>:/\\|?*]*' 

答えて

9

これはワンライナーは、あなたのために働く必要があります見つける:

+0

ありがとうたくさんのバディ! –

+0

anubhava、フォルダにもmvを適用​​できる方法はありますか? –

+0

上記のコマンドは、私が信じているファイルとフォルダに対してこれを行うでしょう。 – anubhava

9

のfnmatchパターンを使用すると、以下のよう[]の文字があることを指定することができ

find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y="$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x")" && mv "$x" "$y" ' \; 
+0

感謝を行うことができます! xargsコマンドをチェーンしてこれらのファイルの名前を変更し、それらの文字を削除して置き換えたり、 - (ダッシュ)と言うことができますか? –

+1

バックスラッシュを見つけるために二重引用符をシングルに変更しなければならなかった – wjandrea

+0

@wjandrea、あなたのフィードバックをありがとう。それに応じてコードを更新しました。 – falsetru

0

上記の回答のどちらもが、ファイルやディレクトリを検索しますスペース( '')またはピリオド/ドット( '。')で終了し、Win32 APIでは表示されません。

.e.g @ falsetruの回答に加えて、一つは

find . -name '*[<>:/\\|?*]*' -o -name '*[ \.]'