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
わからない限り、電話しないでください。スクリプトが読み取り専用ファイルの削除の確認を要求しないようにするには、ここに保証がありますが、明らかに保証することはできません。rm
rm -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
空でないディレクトリで実行するとエラーが発生します。エラーは迷惑ですが無害です。
検索に-delete
and(GNU findなど)がある場合、andを-empty
呼び出す必要はありません。rm
rmdir
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