ファイルX、Y、およびZを除くフォルダー内のすべてのファイルを削除する


17

特定のフォルダーに多くのファイルフォルダーがあり、それらをすべて削除したい。ただし、ファイルX、Y、およびZを保持したかった。

次のようなことができる方法はありますか? rm * | but NOT grep | X or Y or Z


私はそこでこれを行う正規表現を使用できると思いますか?
アミット

回答:


16

rmを使用する代わりに、findを使用する方が簡単な場合があります。このようなコマンドは、正確に「file」という名前のファイルを除くすべてを削除します

find . \! -name 'file' -delete

の多くのバージョンは、グロビングと正規表現の一致をサポートできるはずです。

findの出力をrmにパイプすることもできます

find . \! -name '*pattern*' -print0 | xargs --null rm 

3
そして、これはあなたがファイルを削除することで削除されます正確に何を見ることができます-deleteファイルを削除することで保存されるかなど-delete\!
ショーンJ.ゴフ

1
慎重に、find再帰的です!' pattern 'に一致しないすべてのファイルサブディレクトリも削除されます
アレクサンドルホールデンデーリー14年

xargs経由の方法では、ディレクトリに含まれるファイルの前にディレクトリを削除しようとするのを防ぐために、-depthが必要です。ただし、rmはディレクトリも削除しません。
ユーザー不明

9

zsh setopt EXTENDED_GLOBを使用し、~演算子を使用して(を除く

rm -- *~(x|y|z)

または^演算子(否定):

rm -- ^(x|y|z)

ただし、代わりにファイルを別の場所に移動してから、すべてを削除する必要があります。Enterキーを押すのが早すぎるなど、指の滑りに関してははるかに安全です。


5

bashの以降のバージョンには、extglob必要な処理を実行するための構文を提供するシェルオプションがあります(インストールされているバージョンに含まれているかどうかを確認するには、「パス名拡張」の下のマニュアルページを確認してください)。

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

テストするには、最初に置き換えrmecho、削除するファイルのリストが期待どおりかどうかを確認することをお勧めします。


5
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

重要:コマンドを実行し、削除するファイルが正しいファイルである場合は、再度実行して、ハッシュ文字「#」を削除します。

ファイル名がそれよりも複雑な場合は、

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

繰り返しますが、最初に結果を見てから、ハッシュ記号を削除します。

このバージョン-コメントで示唆されているように-いくつかの文字を保存し、少し明確に見えます。

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r

提案された編集ddeimekeは変更することがあるegrepの引数を"^(file1|filename2|f1le)$"
マイケルMrozek

あなたは3つのファイルを持っている場合abおよびa b最初のプログラムは削除されます-あなたはgrepの部分にABを置く場合:"^[ab]$" abではなくa b、単にあなたの意図に反対しました。2番目のコマンドも同じことを行います。そして3番目も。非常にまれな例外を除き、スクリプトで「ls」を使用しないでください。しないでください。
ユーザー不明

3

遠ざけたいファイルを移動します。1レベル上に移動し、フォルダーを削除します。フォルダーを再作成し、それらのファイルを元に戻します。


なぜマイナスなのか疑問に思います。..実際、他の人が提案するものよりも簡単で安全です。ファイル名に特殊な文字を入力することで、自分の足で撃つことはできません。
アレックス

a)ファイルXが存在する場所で、ファイルXを1つ上のディレクトリに移動します-静かに削除されてしまいました。b)「up」が存在しない最上位ディレクトリにいます。C)あなたはにいるあなたの家、およびに/家庭の書き込み権限がありません。スクリプトにアドバイスを入れて問題なくテストし、そのような状況で使用した場合-ペン!
ユーザー不明

2
a)ねえ、「ファイル 1レベル上げる」と言いましたか?私はそれらを遠ざけると言った。b)では、すべてのファイルを削除しようとしているのです/か?あまり実用的ではありません。c)あなたのファイルをすべて削除しようとすることは、$HOME実際的でもありません。
アレックス

あなたは正しい、ごめんなさい。
ユーザー不明

0

これは、OSX / MacOSログアウトフック用の.shスクリプトとして設定したもので、十分に機能します。

#! /bin/bash
for dir in /PathToFolder/*
 do
    if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then 
      echo ${dir}
      sudo rm -R $dir user
      dscl . -delete $dir
    fi 
  done

exit 0

0

GNU-findでは、-deleteスイッチを使用できます。これは、空の場合もディレクトリを削除します。

 find tmp -not -name X -not -name Y -not -name Z -delete 

X、Y、またはZがディレクトリである場合、これらのファイルも削除されます。find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -deleteこれを回避する1つの方法です。
ジル 'SO-悪である停止

Unixのフォルダはファイル(何でもファイル)であるため、おそらくそれが意図されているものです。質問には、「特定のフォルダーに多数のファイルとフォルダーがあり、それらをすべて削除したい」と明示的に述べられています。
ユーザー不明

/ / ファイルtmpがなかった場合も同様に削除されます。注GNUの標準的な同等として(もGNUの拡張である)XYZ!-not-delete
ステファンChazelas

@StéphaneChazelas:質問から、フォルダー(すべて)を削除することが求められました。強打にはマスキングが必要なので、-notと入力することを好みます。BackslashがAlt-Grを必要とするドイツ語のキーボードレイアウトに依存する場合があります。
ユーザー不明
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.