问题描述
我有一个文本文件,其中包含各种文件的路径列表。我可以使用一个命令来遍历每一行并删除指定路径中的文件吗?
最佳回答
使用 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
次佳回答
这是处理带有空格、反斜杠和其他奇怪字符的文件名的一种方法:
while read -r file; do rm -- "$file"; done < list.txt
这将读取 list.txt
的每一行,将其保存为 $file
并在其上运行 rm
。 -r
确保反斜杠按字面意思读取(以便 \\t
匹配 \\
和 t
,而不是 TAB)。 --
确保它还处理以 -
开头的文件名。
您也可以在 Perl 中执行此操作:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
此命令会将每个文件名读入 %k
哈希值,然后使用 unlink
删除每个文件名。
第三种回答
通过蟒蛇。
import sys
import os
fil = sys.argv[1]
with open(fil) as f:
for line in f:
os.remove(line.rstrip('\n'))
将上述脚本保存在名为 script.py
的文件中,然后通过在终端上触发以下命令来执行脚本。
python3 script.py file
file
是一个输入文件,其中存储了您实际要删除的文件的路径。
第四种回答
很愚蠢,但这里有一个:
tar -cvf /dev/null --remove-files -T filename
第五种回答
另一种方法可以做到这一点:
您可以通过将文件设为 shell 脚本来 ‘prepare’:
$ 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