220

を使用している場合sudo rm -r、次のファイルを除くすべてのファイルを削除するにはどうすればよいですか?

textfile.txt
backup.tar.gz
script.php
database.sql
info.txt
4

20 に答える 20

229
find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete

指定しない場合、-type ffind はディレクトリもリストしますが、これは望ましくない場合があります。


または、非常に便利な組み合わせを使用したより一般的なソリューションfind | xargs:

find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --

たとえば、現在のディレクトリにあるすべての非 txt ファイルを削除します。

find . -type f -not -name '*txt' -print0 | xargs -0 rm --

削除するファイル名にスペースが含まれている場合は、print0andの組み合わせが必要です。-0

于 2010-12-01T14:28:49.703 に答える
155
rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)

BASH で extglob (拡張パターン マッチング) を有効にする必要があります (有効になっていない場合)。

shopt -s extglob
于 2013-03-05T19:38:44.500 に答える
41

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ます。

ルートからすべてを再帰的に削除しようとすると、システムに大きな問題が発生するため、バックアップ ディレクトリをルートに選択します。

確かにこれを行うにはもっとエレガントな方法がありますが、これはかなり簡単です。

于 2010-12-01T14:22:44.750 に答える
20

これらの名前のファイルがディレクトリ ツリーの複数の場所に存在し、それらすべてを保持したいとします。

find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete
于 2010-12-01T15:35:14.620 に答える
19

Bash では GLOBIGNORE 環境変数を使用できます。

php と sql 以外のすべてのファイルを削除したい場合は、次のようにします。

export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=

このように GLOBIGNORE を設定すると、「ls *」や「rm *」などのワイルドカードを使用した php および sql が無視されます。したがって、変数を設定した後に "rm *" を使用すると、txt と tar.gz ファイルのみが削除されます。

于 2012-05-04T12:37:26.757 に答える
9

誰もそれについて言及していないので:

  • 削除したくないファイルを安全な場所にコピーします
  • すべてのファイルを削除します
  • コピーしたファイルを元の場所に移動します
于 2012-12-21T21:55:25.697 に答える
6

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 句はありません。

于 2014-04-10T18:08:47.060 に答える
6

このための for ループを書くことができます... %)

for x in *
do
        if [ "$x" != "exclude_criteria" ]
        then
                rm -f $x;
        fi
done;
于 2010-12-01T14:29:58.727 に答える
4

それを試してみると:

rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)

しかし、スペースを含む名前は (いつものように) 難しいです。Virtualbox\ VMs代わりに引用符でも試しました。そのディレクトリ ( Virtualbox VMs) は常に削除されます。

于 2015-12-08T17:14:31.173 に答える
0

これは @siwei-shen からのコメントに似ていますが、-o複数のパターンを実行するにはフラグが必要です。-oフラグは「または」を表します

find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm

于 2015-02-23T23:20:55.847 に答える
0

私が探していた答えはスクリプトを実行することでしたが、スクリプト自体を削除したくありませんでした。したがって、誰かが同様の回答を探している場合は、次の手順を実行してください。

.sh ファイルを作成し、次のコードを記述します。

    cp my_run_build.sh ../../ 
    rm -rf * cp  
    ../../my_run_build.sh . 
    /*amend rest of the script*/
于 2022-02-24T22:05:17.993 に答える
0

これは、2 つのコマンド シーケンスで実行できます。最初に、除外したくないファイルの名前で配列を定義します。

files=( backup.tar.gz script.php database.sql info.txt )

その後、除外したいディレクトリ内のすべてのファイルをループし、ファイル名が除外したくない配列にあるかどうかを確認します。そうでない場合は、ファイルを削除します。

for file in *; do
  if [[ ! " ${files[@]} " ~= "$file"  ]];then
    rm "$file"
  fi
done
于 2017-01-27T19:34:58.797 に答える
-3

直接コマンドを実行するのではなく、必要なファイルを現在のディレクトリの外の一時ディレクトリに移動してください。rm *次に、またはを使用してすべてのファイルを削除しますrm -r *

次に、必要なファイルを現在のディレクトリに移動します。

于 2013-01-01T04:33:57.623 に答える