2013-01-08 12:17:05 +0000 2013-01-08 12:17:05 +0000
123
123

ディレクトリ内の一部のファイルを除いてすべてのファイルを削除する方法は?

ディレクトリ内のすべてのファイルを削除したいが、一部のファイルは除外したい。例えば、a b c ... zというファイルがあるディレクトリで、upを除くすべてのファイルを削除する必要があります。これを簡単に行う方法はありますか?

回答 (17)

144
144
144
2013-01-08 12:34:49 +0000

rm u,p 以外のすべての 0x6& を bash で実行するには、次のようにタイプするだけです。

rm !(u|p)

このためには以下のオプションを設定する必要があります。

shopt -s extglob

もっと見る グレッグのWiki ](http://mywiki.wooledge.org/glob)

108
108
108
2013-01-08 12:18:23 +0000

そんな時は、

rm *

と入力して、Ctrl+X,を押して、``を全てのファイル名に展開します。

あとは、リストから好きなファイルを2つ削除して、最後にコマンドラインを実行すればいいんです。

71
71
71
2013-01-08 12:35:05 +0000

find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! は次の式を否定します
  • -name はファイル名を指定します
  • -maxdepth 1 は指定されたディレクトリのみを処理します (find はデフォルトではディレクトリをトラバースします)
  • -type f はファイルのみを処理します (ディレクトリなどは処理しません)
  • - -delete はファイルのみを処理します。-print はファイルを削除します

その後、 find の man ページ

Update

  • 式の要素の順序が重要であることに注意してください(ドキュメントを参照)
  • 最初に -delete の代わりに 0x6& を使用してコマンドをテストしてください。
43
43
43
2013-01-08 12:22:58 +0000

単純に、

mv上位ディレクトリに欲しいファイルを入れて、rmディレクトリに入れて、mv戻す。

15
15
15
2013-01-08 14:22:21 +0000

この回答 ](https://superuser.com/a/529861/4724) と似ていますが、特別なオプションは必要ありません。私が知っている限りでは、以下はシェルに似た(漠然とした)/bin/sh(bash、zsh、kshなど)でサポートされている “古い "機能です。

11
11
11
2013-01-09 03:54:14 +0000

findを使わずにやっています。

ls | grep -v '(u|p)' | xargs rm

(編集: “u” と “v” は、ここの他の場所と同様に、正規表現全体の一般的なバージョンとして使用されています。明らかに、あまりにも多くのものをマッチさせないように正規表現を固定するように注意したいでしょう)

他の人が提案しているように、このようなことをたくさんやるのであれば、間違いなくスクリプトが必要になるでしょう。

6
6
6
2013-01-09 22:34:13 +0000

zshでは、

setopt extended_glob # probably in your .zshrc

then

rm ^(u|p)
rm *~(u|p)

2番目は、履歴置換のために^$histcharsを入れても動作しますし、もちろん~の前に任意のグロブを入れても構いません。

5
5
5
2013-01-08 16:32:06 +0000

グロービゴアはコロンで区切られたリスト

GLOBIGNORE=u:p
rm *
```を受け取る
3
3
3
2013-01-08 17:58:46 +0000
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

これは unix の u と p を除くすべてのファイルを削除します。

3
3
3
2013-01-08 17:02:15 +0000

フロッピー時代には、"Except “というDOSの実行ファイルがあって、カレントディレクトリから一時的に物を移動してコマンドを実行していました。

except \*.txt del \*.\*

と言ってテキストファイル以外の全てを削除することができます。

0x1&

とすると、テキストファイル以外のすべてを削除することができます。これはシェルスクリプトとして実装するにはかなり些細なことで、もしこれが2回以上行うようなことであれば、良いアイデアだと思います。

2
2
2
2013-01-08 18:16:45 +0000

完全な正規表現のemacs、posix-awk、posix-extendedスタイル(マニュアルページを参照)で任意の複雑な除外パターンを(影響を受けるすべてのファイル名にまたがって)指定したい方には、これをお勧めします。この例では、現在のディレクトリの up を除外しています。これはスクリプトを書くときに便利かもしれません。

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
1
1
1
2014-09-24 03:05:26 +0000

別のものです。

for FILE in ./*; do if [[$FILE != ./u*]] || [[$FILE != ./p*]];then rm $FILE; fi; done;

これはちょっと長くて、任意の数の引数を簡単に扱えるような関数に簡単にできるかどうかはわかりませんが、うまく動作します。

そしてこれは純粋なbashの良さです。

1
1
1
2014-10-22 12:37:57 +0000

ここにもう一つのバリエーションがあります。次のように入力します。

rm -i *

と入力するか。

rm --interactive *

と入力すると、rm は各ファイルの削除確認を求めてきます。

1
1
1
2016-09-11 02:33:03 +0000
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

を使用して、u、p、.ext ファイルを除くディレクトリを含むすべてのファイルを削除します。

1
1
1
2013-01-09 20:54:59 +0000

私はいつも

rm [a-o,q-t,v-z]*
rm [a-o,z]*

0x1&

これで、どの程度の粒度にしたいかを定義できます。つまり、a から o と Z のファイルを削除したい場合は、次のように使用できます。

0x1& 0x1&

1
1
1
2013-04-01 12:44:13 +0000

xargs を使用した別のバージョン。

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

xargs -I はスペースを含むファイル名を正しく扱うために必要なことに注意してください。

0
0
0
2013-10-22 07:06:44 +0000

台無しにしにくい簡単な方法:例えば *.pdf以外をすべて削除したいとしましょう。

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp

Pytania pokrewne

6
10
11
5
9