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


123

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


以下の回答ははるかに優れていますが、読み取り専用で保存するファイルを作成し、すべて削除してから、元のアクセス許可に戻すことができます(rm -fを使用しない限り)。復元するアクセス許可を知っておく必要があり、プロセス中にそれらへの書き込みアクセスが不要であることを知っておく必要があります。これが、他の答えが優れている理由です。
ジョー

1
隠しファイルも削除する場合は、実行するshopt -s dotglob前に実行しrm (...)ます。

回答:


108

そのような場合に私がやることは、

rm *

それから私は押しCtrl+ X*展開する *すべての可視ファイル名に。

次に、リストから保持したい2つのファイルを削除して、最後にコマンドラインを実行します。


25
これ*は、拡張するファイルのリストが長くならない限りのみ機能すると思います。:-}
フレリッヒラーベ

9
Escに続けて*を使用すると、「*」も展開されます。
スローポイズン

2
@SantoshKumar:それは私には意味がありません。拡張は常に機能しますが、後で使用するコマンドに依存しません。
デアホッホステープラー

2
@OliverSalzburg申し訳ありませんが、組み合わせは少し混乱しています。私はあなたのように書くべきだと思いますCtrl+ Shift+ x+*
Santosh Kumar氏

2
@SantoshKumar:しかし、それは組み合わせではありません。
デア・ホッホシュプラー

143

rmすべてが、u,pbashでだけ入力します。

rm !(u|p)

これには、次のオプションを設定する必要があります。

shopt -s extglob

詳細:glob-Greg's Wiki


1
「extglobbing」をアクティブにする必要があります:shopt -s extglob
sparkie

18
shopt -s extglob@Ashotにする必要があります。また、ディレクトリではなく単なるファイルであるため-rf、コマンドのオプションを削除しました。
slhck

4
選択したファイル 1つのファイルを除外する必要がある場合は、これを試してくださいrm !(index).html。これにより、「index.html」を除く「.html」で終わるすべてのファイルが削除されます。
mzuther

71

使用できます find

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

その後、findのmanページを見て条件を調整できます。

更新

  • 式の要素の順序は重要であることに注意してください(ドキュメントを参照)
  • -print代わりにを使用してコマンドをテストします-delete

    find . ! -name u ! -name p -maxdepth 1 -type f -print

5
ここでは、述語の順序が重要です。-delete直後に置く.と災害になります(CWD内のすべてのファイルが削除されます)
ミシャウシュラジェル

これをよりコンパクトに書くことができますfind . -maxdepth 1 -type f -name '[^up]' -delete
小次郎

4
@kojiroはい、ただし1文字のファイルのみ。より複雑な名前では、正規表現が混乱する可能性があります。
マッテオ

2
find特にグロブするにはファイルが多すぎるとき、私の親友です
テレンスジョンソン

43

シンプル:

mv必要なファイルを上位ディレクトリに、rm次にディレクトリに、そしてmvそれらを戻します。


13
オフコース、それらを上位のディレクトリに移動します。削除するサブディレクトリに移動しないようにしてください
...-コネラク

@Konerak:rmなしで-rはサブディレクトリは削除されません。
reinierpost

11
これは、先のディレクトリに同じ名前のファイルを上書きします
マッテオ

7
これは便利ですが、非アトミックであり、短時間でディレクトリからすべてのファイルを効果的に削除するため、これを支持しています。たとえば、ファイルがネットワーク上で共有されている場合、これは受け入れられません。
サムホセバー

15

この答えに多少似ていますが、特別なオプションは必要ありませんが、私が知っている限り、(曖昧な)/ bin / shに似たシェル(bash、zsh、kshなど)によってサポートされる「古代の」機能

rm [^up]

2
これは1文字のファイル名に対して機能します。長い名前の場合、sparkieの答えの方が優れています。
グレンジャックマン

3
何が問題なのでしょうrm [^up]*か?よく似たようなことをします。
CVn

3
@MichaelKjörling-これは、名前uおよびpのファイルだけでなく、uまたはpで始まるすべてのファイルを削除します。OP(@Ashot)はazやu、pなどを意味すると思います。文字通りではなく、象徴的に。
スディプタチャタジー

4
@HobbesofCalvinこれは、uまたはpで始まらないすべてのファイルを削除します。
rjmunro

@rjmunro-ありがとう、見逃した!:)
スディプタチャタジー

11

検索せずにそれを行う:

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

(編集:ここの他の場所のように、「u」と「v」は正規表現全体の汎用バージョンとして使用されています。明らかに、あまりにも多くのものと一致しないように正規表現を固定する必要があります。)

他の人が示唆しているように、あなたがこれの多くをするつもりなら、間違いなくスクリプトが欲しいでしょう。


いずれかを使用します。grepはデフォルトでregexptを延長ハンドルはありません-Eegrep
マッテオ

2
これは含む任意のファイル除外されますup
マッテオ

@Matteoいいえ、できません。grepはファイルをgrepしていません。lsコマンドの出力をgrepしています。grep -L (u|p)' * | xargs rmwhere -Lは、一致を含まないファイル名をリストすることを意味するようなものを考えています。
rjmunro

4
ああ、あなたが名前だ含まれている任意のファイルを意味するup、含む任意のファイルではありませんup。それは正しいです。を使用して修正できますegrep -v '^(u|p)$'
rjmunro

1
これらの一致を除くすべてを削除します!ls | grep -v 'vuze\|progs' | xargs rm -rf
ニック14

6

zshの場合:

setopt extended_glob  # probably in your .zshrc

それから

rm ^(u|p)

または

rm *~(u|p)

第二は、あなたが持っている場合でも動作します^$histchars歴史の交代の、そしてもちろんあなたが前に、任意のグロブを置くことができます~


5

GLOBIGNOREはコロンで区切られたリストを取ります

GLOBIGNORE=u:p
rm *

12
これは私のシェルでは動作しません(GNU bash 4.1.5(1))。最初rmに、テストディレクトリよりもやや害の少ないものを使用してテストするようにしてください
CVn

3

フロッピーの時代に、「Except」と呼ばれるdos実行可能ファイルがありました。これは、一時的に現在のディレクトリから移動してコマンドを実行するため、次のように言えます。

* .txt del *。*を除く

テキストファイル以外のすべてを削除します。

これは、シェルスクリプトとして実装するのは非常に簡単なことです。これが2倍以上を行う可能性が高い場合は、それが良い考えのようです。


2
同じことを思い出しました。しかし、マルチタスクの時代には一時的にフォルダから移動することは良い考えではないかもしれません:)
セダットカパノグル

3
 find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

これにより、unixのuとpを除くすべてのファイルが削除されます。


2

完全な正規表現emacs、posix-awkまたはposix-extendedスタイルで(影響を受けるすべてのファイル名にまたがる)任意の複雑な除外パターンを指定することを好む人(find manページを参照)をお勧めします。それは除外uし、pこの例では、現在のディレクトリインチ これはスクリプトの場合に便利です。

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf

式の前にディレクトリを指定する必要があります( `find。-regextype ...)。
マッテオ

-regextype唯一のGNUバージョンで動作します
マッテオ

いいえ-現在のディレクトリを使用する場合、検索バージョン(debian squeeze)は式の前に明示的なディレクトリを必要としません
-sparkie

@sparke:これはちょうどGNUの実装に取り組んでいます
マッテオ

@sparkie:コマンドのfindGNU拡張機能であるディレクトリ(最初のパラメーター)を定義しないfind。同じことが-regextypeオプションに適用されます。さらに、コマンドはサブディレクトリ内のファイルも削除しますが、元の質問ではディレクトリ内のファイルについて明確に尋ねられます。
ミッコランタライネン

1

私はいつも使用します:

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

これにより、作成する粒度を定義できます。スルーoおよびZファイルを削除する場合は、次を使用できます。

rm [a-o,z]*

1

を使用したさらに別のバージョンxargs

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

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


1

さらに別の:

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

それは一種の長いものであり、任意の数の引数を簡単に収容できる関数に簡単に作成できるかどうかはわかりませんが、うまく機能します。

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


1

別のバリエーションがあります。次のように入力できます:

rm -i *

または:

rm --interactive *

だから、rmそれぞれのファイルの削除の確認をお願いします。


1

つかいます:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

u、p、および.extファイルを除く、ディレクトリを含むすべてのファイルを削除するため。


0

混乱させるのが難しい簡単な方法:* .pdf以外のすべてを削除したいとしましょう:

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.