検索:フォルダとサブフォルダを削除しますが、両方のファイルの例外を追加します。

検索:フォルダとサブフォルダを削除しますが、両方のファイルの例外を追加します。

findこのコマンドを使用して、次のタスクを実行しようとします。
ファイル、フォルダ、サブフォルダ(2つのファイルを除く)を含むフォルダ全体を削除します。以下は、必要な項目の例です。

 test/folder1/file1.txt
 test/folder1/file2.txt
 test/folder1/subfolder1/
 test/folder1/subfolder1/file3.txt
 test/folder1/subfolder1/subfolder2/file4.txt
 test/folder2/file5.txt
 test/folder3/file6.txt

とを除くfile2.txtすべての項目を削除する必要があります。file3.txt

これが私がしたことです

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt'

私が指定したファイルを除くすべてのファイルが一覧表示されます。ただし、-exec rm -rf {}コマンドの最後に追加すると、すべてが削除されます。

私も成功せずに別のコマンドを試しました

rm -r  test/folder1/ !(file2.txt|file3.txt)

正規表現がわからないので、オンラインで見つけたコマンドをテストして動作させようとしましたが、何も機能しないようです。

答え1

電話しないでくださいrm -rf。ディレクトリから実行すると、そのディレクトリとサブディレクトリのすべてのファイル、さらに保持したいファイルも削除されます。より一般的に言えば、簡単な方法がなぜ機能しないのかrm -rfわからない限り、電話しないでください。スクリプトが読み取り専用ファイルの削除の確認を要求しないようにするには、ここに保証がありますが、明らかに保証することはできません。rmrm -f-r

ファイルのみ削除:

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a -exec rm -f {} +

空のディレクトリも削除するには、rmdirこの呼び出しを呼び出します。-depthディレクトリ自体よりもディレクトリの内容を考慮するために使用します。

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a \( -type d rmdir {} \; -o -exec rm -f {} \; \)

rmdir空でないディレクトリで実行するとエラーが発生します。エラーは迷惑ですが無害です。

検索に-deleteand(GNU findなど)がある場合、andを-empty呼び出す必要はありません。rmrmdir

find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a ! -type d ! -empty -delete

答え2

オプションを使用してこれを行う方法もわかりませんが、findシェルスクリプトを使用することもできますfind

まず、ファイルを削除してください。

 find . -type f -exec bash -c \
    ' [[ "{}" == "./test/folder1/file2.txt" || \
         "{}" == "./test/folder1/subfolder1/file3.txt" ]] \
      || rm "{}" ' \;

次に、空でないフォルダをすべて削除します。

find .  -type d -exec rmdir {} \; 2>/dev/null

関連情報