特定のファイルのみを残して、ディレクトリ内のすべてのファイルを削除したいのですが、名前で共通するものはありません。どうすればそれを達成できますか?
たとえば、保持したいファイル名は次のとおりです。
file_1.png
、another_file.jpg
、some_music.mp3
特定のファイルのみを残して、ディレクトリ内のすべてのファイルを削除したいのですが、名前で共通するものはありません。どうすればそれを達成できますか?
たとえば、保持したいファイル名は次のとおりです。
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のようなファイルブラウザーCtrlを使用して、保持したいいくつかのファイルを実際にクリックしてメニューを使用できる数少ないケースの1つです。Edit -> Invert Selection
他のファイルを取得してそれらを削除するには。
ls
ため、保存したいファイルを見逃していないかどうかを確認するためにを実行できます。
保持するファイルの名前をテキストファイルに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バイトで区切られた一連の行として扱います。これは、空白を含むファイル名で機能します。
find
は、むしろやりたいfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
shopt -u extglob
)。