特定のファイルのみを残して、ディレクトリ内のすべてのファイルを削除したいのですが、名前で共通するものはありません。どうすればそれを達成できますか?
たとえば、保持したいファイル名は次のとおりです。
file_1.png
、another_file.jpg
、some_music.mp3
Bashを使用している場合:
_shopt -s extglob
rm -- !(file1|file2|file3)
_
最初の行は拡張パターンマッチングをアクティブ化するだけで、その後はそのうちの1つを使用します。
!(pattern-list)
は、指定されたパターンの1つ以外のすべてに一致します
また、pattern-listは、_|
_で区切られた1つ以上のパターンのリストです。
またはzsh
_setopt extendedglob
rm -- ^(file1|file2)
_
または、より移植性が高く、find
を使用します。
_find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
_
サブディレクトリtmp
を作成し、保持するすべてのファイルをそのディレクトリに移動して、rm -f *
その後。 tmp
ディレクトリには影響しません。
その後、次のようにします。
mv tmp/* .
rmdir tmp
(移動したファイルがドットで始まっていないと仮定します)。
これは、マウスと実際にできるNautilusのようなファイルブラウザを使用することが理にかなっている数少ないケースの1つです。 Ctrl保持するいくつかのファイルをクリックして、メニューを使用します:Edit -> Invert Selection
を使用して他のファイルを取得し、それらを削除します。
保持するファイルの名前をテキストファイルに1行に1つずつ追加します。このファイルはディレクトリに配置しないか、ファイル名も追加する必要があります。
ディレクトリの名前がfooで、ファイルの名前がbarの場合は、次のようにします。
find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm
これは次のことを行います。
find -type f
fooとそのサブディレクトリ内のすべてのファイルの名前を検索し、それらをSTDOUTに出力します。オプション-print0
ファイル名をNULバイトで区切ります。grep -v -f bar
barの行に一致するすべてのファイル名を除外します。オプション-z
入力をNULバイトで区切られた行のセットとして扱い、オプション-Z
NULバイトで出力を制限します。xargs rm
はrm
を繰り返し呼び出してファイルを削除します。オプション-0
入力をNULバイトで区切られた行のセットとして扱います。これは、空白を含むファイル名で機能します。