を使用している場合sudo rm -r
、次のファイルを除くすべてのファイルを削除するにはどうすればよいですか?
textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete
指定しない場合、-type f
find はディレクトリもリストしますが、これは望ましくない場合があります。
または、非常に便利な組み合わせを使用したより一般的なソリューションfind | xargs
:
find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --
たとえば、現在のディレクトリにあるすべての非 txt ファイルを削除します。
find . -type f -not -name '*txt' -print0 | xargs -0 rm --
削除するファイル名にスペースが含まれている場合は、print0
andの組み合わせが必要です。-0
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)
BASH で extglob (拡張パターン マッチング) を有効にする必要があります (有効になっていない場合)。
shopt -s extglob
find . | grep -v "excluded files criteria" | xargs rm
これにより、現在のディレクトリ内のすべてのファイルが一覧表示され、基準に一致しないすべてのファイルが一覧表示され (ディレクトリ名と一致することに注意してください)、それらが削除されます。
更新:編集に基づいて、リストしたファイルを除くすべてを現在のディレクトリから本当に削除したい場合は、これを使用できます:
mkdir /tmp_backup && mv textfile.txt backup.tar.gz script.php database.sql info.txt /tmp_backup/ && rm -r && mv /tmp_backup/* . && rmdir /tmp_backup
バックアップディレクトリを作成し/tmp_backup
(ルート権限を持っていますよね?)、リストしたファイルをそのディレクトリに移動し、現在のディレクトリ内のすべてを再帰的に削除します(正しいディレクトリにいることはわかっていますよね?)、から現在のディレクトリに戻り/tmp_backup
、最後に削除し/tmp_backup
ます。
ルートからすべてを再帰的に削除しようとすると、システムに大きな問題が発生するため、バックアップ ディレクトリをルートに選択します。
確かにこれを行うにはもっとエレガントな方法がありますが、これはかなり簡単です。
これらの名前のファイルがディレクトリ ツリーの複数の場所に存在し、それらすべてを保持したいとします。
find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
Bash では GLOBIGNORE 環境変数を使用できます。
php と sql 以外のすべてのファイルを削除したい場合は、次のようにします。
export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=
このように GLOBIGNORE を設定すると、「ls *」や「rm *」などのワイルドカードを使用した php および sql が無視されます。したがって、変数を設定した後に "rm *" を使用すると、txt と tar.gz ファイルのみが削除されます。
誰もそれについて言及していないので:
OPには少し遅れていますが、グーグルでずっと後でここにたどり着く人にとっては役立つことを願っています...
@awi による回答と、@Jamie Bullock による -delete に関するコメントが非常に役立つことがわかりました。シンプルなユーティリティで、最小限の入力で毎回異なるファイル名/タイプを無視して、異なるディレクトリでこれを実行できます。
rm_except (または任意の名前)
#!/bin/bash
ignore=""
for fignore in "$@"; do
ignore=${ignore}"-not -name ${fignore} "
done
find . -type f $ignore -delete
たとえば、テキスト ファイルと foo.bar 以外のすべてを削除するには:
rm_except *.txt foo.bar
@mishunika に似ていますが、if 句はありません。
このための for ループを書くことができます... %)
for x in *
do
if [ "$x" != "exclude_criteria" ]
then
rm -f $x;
fi
done;
それを試してみると:
rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)
しかし、スペースを含む名前は (いつものように) 難しいです。Virtualbox\ VMs
代わりに引用符でも試しました。そのディレクトリ ( Virtualbox VMs
) は常に削除されます。
これは @siwei-shen からのコメントに似ていますが、-o
複数のパターンを実行するにはフラグが必要です。-o
フラグは「または」を表します
find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm
私が探していた答えはスクリプトを実行することでしたが、スクリプト自体を削除したくありませんでした。したがって、誰かが同様の回答を探している場合は、次の手順を実行してください。
.sh ファイルを作成し、次のコードを記述します。
cp my_run_build.sh ../../
rm -rf * cp
../../my_run_build.sh .
/*amend rest of the script*/
これは、2 つのコマンド シーケンスで実行できます。最初に、除外したくないファイルの名前で配列を定義します。
files=( backup.tar.gz script.php database.sql info.txt )
その後、除外したいディレクトリ内のすべてのファイルをループし、ファイル名が除外したくない配列にあるかどうかを確認します。そうでない場合は、ファイルを削除します。
for file in *; do
if [[ ! " ${files[@]} " ~= "$file" ]];then
rm "$file"
fi
done
直接コマンドを実行するのではなく、必要なファイルを現在のディレクトリの外の一時ディレクトリに移動してください。rm *
次に、またはを使用してすべてのファイルを削除しますrm -r *
。
次に、必要なファイルを現在のディレクトリに移動します。