回答:
警告: 再帰的にファイルを削除するためのコマンドを実行するのは危険です。常に、そのような危険なコマンドを盲目的に実行する前に、常にテストしてください。 決して rootユーザーとして(またはsudoなどで)実行してください。
これは、ちょっとしたbashを使って行うのは比較的簡単です。あなたがこれをたくさんやろうとしているならば、あなたはそれをあなたが渡す引数にすることさえできます。しかし、一時休止のために、以下の私の簡単なテストのようなものを試してください。
まず、テスト用のフォルダをいくつか作成します。
cd test; mkdir -p one two three four five six .hidden
次に、次の内容でbashスクリプト(この場合はrm.bash)を作成します。
for i in `ls -A`
do
if [ ! "${i}" == 'three' ] && [ ! "${i}" == $0 ]; then
echo "would delete ${i}"
else
echo "not deleting ${i}"
fi
done
説明する: ls -A
現在のフォルダとその親フォルダ以外のすべてのファイルを印刷します( .
そして ..
)このリストを for
すべての内容を繰り返すためにループします。私は(任意に)私たちが残す唯一のフォルダは "3"であり、私は削除したくないと判断しました rm.bash
スクリプト自体。
従って if
問題のファイル/フォルダに名前が付いていない限り、条件は真になります。 three
または rm.bash
( $0
これは、あなたがファイルを何を呼び出しても機能することを意味します。
すぐにこれを実行するのではなく rm -rf ${i}
(これは危険です)、私は代わりに2、3を使用しました echo
何が削除され、何が削除されないのかを示すコマンド。
これが私の出力例です。
would delete five
would delete four
would delete one
not deleting rm.bash
would delete six
not deleting three
would delete two
スクリプトが正しい動作をしているべきであることを確認したら、それがしてはいけないことなどを削除しないで、あなたはこれにコードを変更することができます:
for i in `ls -A`
do
if [ ! "${i}" == 'three' ] && [ ! "${i}" == $0 ]; then
rm -rf ${i}
fi
done
代替案です。 @Adam Cの答えと同じ警告が適用されます。テストせずにこれを実行しないでください。
いくつかのデモデータ:
$ mkdir testing; cd testing
$ mkdir one two three four "fi ve"
$ touch one/one.txt two/two.txt three four/keep.txt fi\ ve/.hidden
4つを除くすべての削除をシミュレートする/
$ find . -mindepth 1 -path ./four -prune -o -exec echo would remove "{}" +
出力:
would remove ./fi ve ./fi ve/.hidden ./two ./two/two.txt ./one ./one/one.txt ./three
ノート:
-mindepth 1 prevents including /.
Prune removes path four/ from processing, or...
-o means "or" (either prune the left, or exec on the right)
High speed / low resource use:
find will stop processing a tree once pruned (no wasted operations)
One xargs-style list is built (with +), removal happens in one command.
To process one at a time, replace + with \;
Spaces are handled correctly within " "
-delete is shorter but may not operate on directories
find won't follow symlinks by default