回答:
使用xargs
:
xargs rm < file # or
xargs -a file rm
ただし、ファイル名/パスにエスケープする必要のある文字が含まれている場合は機能しません。
ファイル名に改行がない場合は、次を実行できます。
tr '\n' '\0' < file | xargs -0 rm # or
xargs -a file -I{} rm {}
または、次のスクリプトを作成できます。
#!/bin/bash
if [ -z "$1" ]; then
echo -e "Usage: $(basename $0) FILE\n"
exit 1
fi
if [ ! -e "$1" ]; then
echo -e "$1: File doesn't exist.\n"
exit 1
fi
while read -r line; do
[ -n "$line" ] && rm -- "$line"
done < "$1"
として保存し/usr/local/bin/delete-from
、実行権限を付与します。
sudo chmod +x /usr/local/bin/delete-from
次に、それを実行します:
delete-from /path/to/file/with/list/of/files
cat file
(ba)shまたはcshの「rm- 」だけで済みます。
cat
述べたように、@ shooper は役に立ちませstdin
ん。彼の更新された答えを見てください
空白、バックスラッシュ、その他の奇妙な文字を含むファイル名を処理できる1つの方法を次に示します。
while read -r file; do rm -- "$file"; done < list.txt
の各行が読み込まlist.txt
れ、保存され$file
、実行さrm
れます。これ-r
により、バックスラッシュが文字どおりに読み取られるようになります(つまり、TABではなくa とaに\t
一致します)。それがまた始まるファイル名を扱うことを保証します。\
t
--
-
Perlでこれを行うこともできます。
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
これは、各ファイル名を%k
ハッシュに読み込んでから、それぞれunlink
を削除するために使用します。
Python経由。
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
likeという名前のファイルに上記のスクリプトを保存し、script.py
ターミナルで以下のコマンドを実行してスクリプトを実行します。
python3 script.py file
file
は、実際に削除するファイルのパスが保存されている入力ファイルです。
これを行う別の方法:
ファイルをシェルスクリプトにすることで、ファイルを「準備」できます。
$ sed -E "s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
ファイル名に一重引用符('
)が含まれている場合は、このわずかに拡張されたバージョンを使用して、最初にそれらをエスケープできます。
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file
rm 'file1'
rm 'file2'
rm 'file with some spaces.ext'
rm 'a file with "quotes"'
rm 'a file with '\''quotes'\'''
そして、次のようにパイプすることでこれを実行できますsh
。
$ sed -E "s/'/'\\\''; s/^(.*)$/rm '\1'/" input_file | sh
私が理解しているように、完全なパスを持つファイルを含むテキストファイルがあります。次の2つの可能性があります。
リストには、改行で区切られたファイル名があります。つまり、各行にはファイルへの完全なパスがあります。この場合:ここに簡単な方法があります:
for i in $(cat listOfFiles.txt); do
rm -f $i
done
リストにスペースまたはタブで区切られた1行以上のファイル名がある場合、ドリルは次のとおりです。
sed -i 's/\s\+/\n/g' listOfFiles.txt
これにより、すべての空白が改行に変換されます
for i in $(cat listOfFiles.txt); do
rm -f $i
done
はい、それを実現する方法はたくさんありますが、これは非常に簡単なアプローチです。
cat
ですが、必須ではありません。stdin
リダイレクトを使用できます< file xargs rm