特定のファイルを除いて、Solarisのすべてのファイル+フォルダを繰り返し削除します。

特定のファイルを除いて、Solarisのすべてのファイル+フォルダを繰り返し削除します。

次のコマンドは、104.tarファイルを除くフォルダ内のすべてのエントリを再帰的に削除します/tmp/CURRENT

find /tmp/CURRENT/ -type f ! -name '104.tar' -exec rm -rf {} +

ただし、その下のサブフォルダは繰り返し削除されません/tmp/CURRENT

与えると-type d役に立つかもしれませんが、別のコマンドは必要ありません。私の要件は、以下で試したのと同じ単一のコマンドを使用してファイルとフォルダを削除することですが、役に立ちませんでした。

find /tmp/CURRENT/ -type f -type d ! -name '104.tar' -exec rm -rf {} +

-typeオプションをまったく指定しないと、コマンドはフォルダの/tmp/CURRENT内容ではなくフォルダ全体を削除します。

注:私のオペレーティングシステムはSun Solaris Sparcです。

何か提案してもらえますか?

ベストアンサー1

使用しながら話し-type fます。findただファイルだけを考えてください。したがって、ディレクトリが削除されないのは正常です。自己削除を防ぐには、/tmp/CURRENT/以下を試してください。

  1. findこれをサポートしている場合-mindepthfindLinuxシステムのデフォルトであるGNUにはこの機能がありますが、それをサポートできる他のバージョンはわかりませんfind)、少なくとも1レベル前のコンテンツのみを表示するように指示できます。

    find /tmp/CURRENT/  ! -name '104.tar' -mindepth 1 
    
  2. !これを除外するには、2番目の演算子を使用してください。

    find /tmp/CURRENT/ ! -path /tmp/CURRENT/ ! -name '104.tar' 
    
  3. を使用して-path少なくとも1文字で始まり/tmp/CURRENT、その後に少なくとも1文字が続くパスを見つけます。

    find /tmp/CURRENT/ -path '/tmp/CURRENT/?*' ! -name '104.tar' 
    

いずれの場合も、コマンドの-exec rm -r {} +最後に追加して一致を削除できます。

ただし、このコマンドは削除されることに注意してください。すべて特定のファイルを除いて/tmp/CURRENT/104.tar。したがって、サブディレクトリに/tmp/CURRENT/dir1/104.tar指定されたファイルまたは他のファイルがある場合、104.tarそのファイルは削除されます。これが望まない場合は、質問を編集して明確にしてください。

/tmp/CURRENTもちろん、単にすべての項目を除いて削除したい場合は、/tmp/CURRENT/104.tarまったく必要ありません。findBashで実行できます。

shopt -s extglob
rm -r /tmp/CURRENT/!(104.tar)

おすすめ記事