特定のフォルダに多数のファイルandフォルダがあり、それらをすべて削除したい。ただし、ファイルX、Y、およびZを保持したかった。
私ができるような方法はありますか:rm * | but NOT grep | X or Y or Z
Rmを使用する代わりに、 find を使用する方が簡単な場合があります。このようなコマンドは、正確に「file」という名前のファイルを除くすべてを削除します
find . \! -name 'file' -delete
の多くのバージョンは、グロビングと正規表現マッチングをサポートできるはずです。
また、findの出力をrmにパイプすることもできます。
find . \! -name '*pattern*' -print0 | xargs --null rm
setopt EXTENDED_GLOB
を使用したzshの使用、~
演算子の使用(except)
rm -- *~(x|y|z)
または^
演算子(否定):
rm -- ^(x|y|z)
ただし、代わりにファイルを別の場所に移動してから、すべてを削除する必要があります。打撃が早すぎるなど、指の滑りの点ではるかに安全です。
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
それ以降のバージョンのbashにはextglob
シェルオプションがあり、必要なことを実行するための構文が提供されます(インストールされているバージョンにそれがあるかどうかを確認するには、「パス名の展開」のmanページを確認してください)。
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
テストするには、最初にrm
をecho
に置き換えて、削除するファイルのリストが期待どおりかどうかを確認することをお勧めします。
残したいファイルを移動します。 1つ上のレベルに移動し、フォルダを削除します。フォルダを再作成し、それらのファイルを元に戻します。
これは、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
GNU-findを使用すると、空の場合もディレクトリを削除する-deleteスイッチを使用できます。
find tmp -not -name X -not -name Y -not -name Z -delete