
私は走った
/bin/find /home/user/myfiles \! -name '.htaccess' -exec rm -r {} \;
それはすべてを削除します存在する myfiles
ディレクトリmyfiles
自体が.htaccess
存在しない場合。
私が期待するのは、ディレクトリからファイル(.htacess
すべてのファイルを除く)を見つけて削除することです。
私は何が間違っていましたか?
答え1
あなたのバージョンが(GNU、macOS Monterey、または他のバージョン)をfind
サポートしている場合は、次のものを使用できます。-delete
-mindepth
find
/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()に話さないでくださいという内容があります。