`find`は最上位ディレクトリとその内容を削除します。

`find`は最上位ディレクトリとその内容を削除します。

私は走った

/bin/find /home/user/myfiles \! -name '.htaccess' -exec rm -r {} \;

それはすべてを削除します存在する myfilesディレクトリmyfiles自体が.htaccess存在しない場合。

私が期待するのは、ディレクトリからファイル(.htacessすべてのファイルを除く)を見つけて削除することです。

私は何が間違っていましたか?

答え1

あなたのバージョンが(GNU、macOS Monterey、または他のバージョン)をfindサポートしている場合は、次のものを使用できます。-delete-mindepthfind

/bin/find /home/user/myfiles -mindepth 1 -delete

それ以外の場合は、find次のようにパスを指定してみましょう。

/bin/find /home/user/myfiles/*

保持したいディレクトリの下のすべてのエントリをマージし、findその下で作業を実行します。

これは、単にアイテムをリストまたは削除する前に削除するなど、非破壊的な方法で最初に実行するために基本的に独自のタスクパラメータを取得するfindなどのツールにとって良いアイデアです。

答え2

find開始ディレクトリ自体から検索を開始します。つまり、

foo/
    a
    b

あなたは走る

find foo

あなたは得るでしょう

foo
foo/a
foo/b

これにより、-exec rm -r {} \;起動ディレクトリも削除されます。あなたができることは、findスタートアップディレクトリを含めないように指示することです:

find /home/user/myfiles ! -path /home/user/myfiles -exec rm -r {} \;

答え3

ダニエル・ウォーカーの答えコマンドで何が起こっているのか、そしてそれを解決する1つの方法について説明します(Stéphane Chazelasは他のオプションを提供します)コメントから)。使い方を知っておくと良いでしょう  find。ただし、Bashを使用している場合、この特定のタスクを実行する別の方法は次のとおりです。

(shopt -s dotglob  &&  cd /home/user/myfiles  &&  rm -r -- *)

この機能が組み込まれているため、find再帰削除を実行する必要はありません。rm

答え4

再帰的に削除するように指示しますが、/home/user/myfiles/ /home/user/myfiles/a /home/user/myfiles/b削除するように指示しません/home/user/myfiles/c。しかし、再帰的に削除するように指示するだけで、/home/user/myfiles/すべてを削除するのに十分です。

除外(of find)は削除しないように言いません。rmこれについてcommand()に話さないでくださいという内容があります。

関連情報