巨大なファイルのリストから特定のファイルを削除する方法

巨大なファイルのリストから特定のファイルを削除する方法

ファイルの多いフォルダがあります。

フォルダから次のファイルを削除したいと思います。

ni_mayb17000.mol2  
ni_mayb50000.mol2
ni_fda.mol2
ni_mayb2000.mol2
ni_mayb5000.mol2
ni_in_trials1000_2999.mol2   
ni_in_trials1-999.mol2        
ni_in_trials5000.mol2         
ni_intrials8000.mol2          
ni_intrialsfinal.mol2        
ni_mayb13000.mol2
ni_mayb21000.mol2
ni_mayb45000.mol2
ni_mayb55000.mol2
ni_mayb25000.mol2
ni_mayb60000.mol2
ni_mayb30000.mol2
ni_mayb8000.mol2
ni_mayb35000.mol2
ni_mayb_f.mol2
ni_mayb40000.mol2 
ni_world_not_fda.mol2

削除するファイルが特定のパターンに従わないため、ワイルドカードやパターンを使用できません。また、パターンを使用すると、意図しないファイルが削除される危険性があります。削除したいファイル名を正確に知っているので、必要なファイルをリストとして保存してから、ループを使用して削除する予定ですfor

for i in $list; do
   rm $i -f; 
done

どのようにリストとして保存し、このforリストを実行できますか?

ベストアンサー1

使い方の問題for i in $listは」スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?「そして」bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク」。

name.list現在のディレクトリのファイルを参照して、1行に1つずつファイル名を手動でコンパイルしたファイル名のリストを想定します。

while IFS= read -r name; do
    rm -f "./$name"
done <name.list

これは各名前を変数として読み込み、name変数rm -fの値として呼び出します。ファイルが存在しないとエラーが出力されません-f$namewillの値は、削除が現在のディレクトリに与える影響を制限するために./以前に呼び出されました。rm

ファイル名のリストを繰り返しながらいくつかの出力を生成する少し複雑なバリエーションです。

while IFS= read -r name; do
    if [ -e "./$name" ]; then
        printf 'Removing "%s"\n' "$name"
        rm -f "./$name"
    else
        printf 'Did not find "%s"\n' "$name"
    fi
done <name.list

または以下を使用してくださいxargs

xargs -t -I {} rm -f ./{} <name.list

rm -fこれにより、ファイルの各行の内容が記憶されますname.list。表示される「追跡モード」-tオプションを有効にします。xargsxargs

おすすめ記事