web-dev-qa-db-ja.com

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

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

私ができるような方法はありますか:rm * | but NOT grep | X or Y or Z

18
Amit

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

find . \! -name 'file' -delete

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

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

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

setopt EXTENDED_GLOBを使用したzshの使用、~演算子の使用(except

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

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

rm -- ^(x|y|z)

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

9
wnoise
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
5
ddeimeke

それ以降のバージョンのbashにはextglobシェルオプションがあり、必要なことを実行するための構文が提供されます(インストールされているバージョンにそれがあるかどうかを確認するには、「パス名の展開」のmanページを確認してください)。

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

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

5
camh

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

3
alex

これは、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
ICMP

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

 find tmp -not -name X -not -name Y -not -name Z -delete 
0
user unknown