ファイルの多いフォルダがあります。
フォルダから次のファイルを削除したいと思います。
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
。$name
willの値は、削除が現在のディレクトリに与える影響を制限するために./
以前に呼び出されました。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
オプションを有効にします。xargs
xargs
答え2
たとえば、ファイルに入れると、filelist.txt
次のループを試すことができます。
while IFS= read -r filename
do
rm "$filename"
done < filelist.txt
ただし、実際にファイルを削除する前に必ずテストしてください(例:rm "$filename"
で置き換えますecho "Would now remove $filename"
)。
答え3
もしあなたなら削除する正確なファイル名を知ってください。を選択して直接削除します。
rm file1 file2 ...
そして、別のファイルに保存し、シェルループを使用してそのファイルを再度読み取るのをスキップします。その後、そのファイル名を削除したいかもしれません!効率は好みの問題ですが、rm file1 ...
1つのコマンドにすぎませんが、他の方法はいくつかの手順を実行する必要があり、引用符や他のシェルトラップを省略すると事故が発生しやすくなります。