
古いバージョンの Mac OS の拡張子のないファイルが 10,000 個以上あります。ファイル構造が非常にネストされており、さまざまな奇妙な書式や文字も含まれています。ファイル タイプや作成者コードは添付されていません。これらのファイルの多くには、拡張子を判別できるテキストが含まれています (たとえば、Word.Document.8 は、そのバージョンの Word で作成されたすべてのファイルのテキストにあります)。
一度にこれらのファイル タイプのうちの 1 つに対して機能しそうなスクリプトを見つけましたが、不正な文字の後のファイル名の一部が消去されてしまうため、よくありません。
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'Word.Document.8' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.doc
最初にファイル名の文字をクリーンアップするべきでしょうか、それともスクリプト内でプログラム的に処理してそのままにしておくべきでしょうか? ファイル名から情報が失われない限り、スラッシュやその他の問題のある文字をクリーンアップしても問題ないと思います。また、ファイル名をクリーンアップすると重複する文字が出てくる可能性が高いので、クリーンアップ スクリプトでは拡張子の前に「-1」のようなものを追加して、何も失われないようにする必要があります。
私はこのスクリプトに縛られているわけではありませんが、理解しやすいので、これは利点です。このファイル サーバーには Mac OS X 10.6 がインストールされていますが、最近のバージョンの OS X にアクセスできます。
答え1
まだ質問を100%理解できているわけではありませんが、いくつか考えを述べたいと思います。
sed 's/:.*//'
コロンを含むファイル名は、すべて壊れます。コロンは Mac でファイル名として有効な文字ですか? そうでない場合は、問題にはなりません。そうでない場合は、sed 's/: Word.Document.8$//'
またはを実行することを検討してくださいsed 's/: [^:]*$//'
。mv
によって生成されたコマンドにxargs
問題があるようです。 を試してください
xargs -I % sh -c 'echo mv "%" "%.doc"'
。
答え2
2 番目の質問は、スクリプトを変更して、複数のファイル タイプを同時に検索し、それぞれに適切な拡張子を付けるにはどうすればよいかということです。
始めるにあたってのヒントをいくつか紹介します。
sed -e '/Word\.Document\.8/s/何か/その他/;s/別の/さらにもう一つ/'\ -e '/Excel\.Sheet\.8/s/何か2/その他2/;s/もう2/さらに2/'\ ...
または
awk ' /Word\.文書\.8/ { Word の awk コマンド } /Excel\.Sheet\.8/ { Excel の awk コマンド } ⋮ '