2016-05-26 10 views
0

1つのディレクトリに、約50個のファイルとフォルダがあり、名前にスペースが含まれています。私はls、grep、xargsコマンドを使用していくつかのフォルダを削除したいが、名前のスペースを含むフォルダを削除することはできず、例外を表示する。誰も助けることができますか? Solaris OSを使用する。 $ファイル以外のすべてを削除しようとしましたxargsでrmコマンドを使用して、名前にスペースを含む一部のフォルダを除外します

ls | grep -v "$ files" | xargs rm

私が以下のコマンドを試したとき、それは私がしたくない$ファイルを含むすべてを削除します。

ls | grep -v "$ files" | xargs rm - * \ *

答えて

0

$filename周り

ls | grep -v "$files" | while read filename; do 
    rm "$filename" 
done 

引用符が重要です。引用符がないと、引数は名前に含まれる可能性のあるスペースに分割されます。

ディレクトリを削除しないことに注意してください。他の人が触れているように、rm -rまたはrmdirが必要です。しかしrm -rはディレクトリとその中のすべてを削除します。デフォルトでrmdirは、空でないディレクトリは削除しません。

おそらくファイル場合

ls | grep -v "$files" | while read filename; do 
    ls -ld "$filename" 
done 

ないリストディレクトリの内容あなたは正しいファイルを取得していることを確認するls-ldオプションを使用し、またのようなもので最初のテストを実行する必要があります名前が渡されると、ディレクトリになります。

0

UNIX系システムでは、ASCII NUL文字とスラッシュを除き、ファイル名に任意の文字を使用することができます。スラッシュはパス名に(ディレクトリ区切り記号として)現れるが、実際のディレクトリエントリの名前には現れない。つまり、xargsが読み取るファイルのリストには、空白、タブ、改行文字などの空白文字が含まれている可能性があります。既定では、xargsは、読み取っているファイルのリストが引数の区切り記号として空白を使用すると仮定しているため、ファイル名に実際に空白が含まれている場合は正しく処理できません。これにより、デフォルトの動作はxargsとなり、任意のデータを処理するのにはほとんど役に立ちません。

この問題を解決するため、GNU findutilsはfindに対して '-print0'アクションを導入しました。これは、ASCII NUL文字を使用して、生成するファイルリスト内のエントリを区切ります。これは、パス名の中に現れない唯一の文字であるため、セパレータの理想的な選択肢です。 '-0'オプションをxargsにすると、引数が空白ではなくASCII NULで区切られているとみなされます。また、デフォルトの動作であるxargsの別の誤った機能を無効にします。これは、入力の文字を引用することに注意しています。 xargsのいくつかのバージョンは、入力に孤立した '_'が表示されても終了しますが、GNU findはもはやそれを行いません(Unix標準ではオプションの動作になっています)。だから、

、xargsのと一緒-print0見つける入れ-0私たちは、このコマンドを取得する:

find /var/tmp/stuff -mtime +90 -print0 | xargs -0 /bin/rm 

結果が正しくファイルのリストに表示される可能性のあるすべての文字を処理手続の効率的な方法であります削除する。これは良い知らせです。しかし、あなたが期待していると確信しているように、さらに悪いニュースがあります。問題は、これは移植可能な構造ではないということです。 Unixの他のバージョン(特にBSD由来のもの)は '-print0'をサポートしていますが、普遍的なものではありません。

+0

'find ... -print0'と' xargs -0'は非標準のGNU拡張です。あなたはGNUユーティリティについて言及していますが、GNU以外の実装ではそれらの拡張機能が不足している可能性があることを明確にしていません。 –

0

-rオプション(再帰的)を使用しない限り、rmコマンドでフォルダを削除することはできません。私は、ディレクトリ全体ではなく、個々のファイルを削除したいと仮定しています。

いずれの場合でも、Solarisでは常に利用可能な標準のfindコマンドを使用して、アービトレイ名でファイルとディレクトリを処理できます。 xargsもGNU固有の拡張も必要ありません。

ここは例です。あなたは、ファイルの削除をしたい場合は

find . -type f ! -name "*.jpg" ! -name "*keepme*" ! -name "*.java" -exec echo rm {} + 

echoコマンドを削除します。.JPGまたは.javaファイル接尾辞、およびそれらの名前にkeepmeを有するものを除くすべてのファイルが残りのすべてのファイルが処理され、維持されます実際に実行される。非標準の拡張機能を使用して、あなたのシェルがwhile read ...を実装し、これも動作するはずと仮定しなければ

関連する問題