![如何删除文本文件中列出的文件](https://linux22.com/image/1084737/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%97%E5%87%BA%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个文本文件,其中列出了各种文件的路径。是否有命令可以迭代每一行并删除指定路径下的文件?
答案1
使用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
答案2
这里有一种方法可以处理带有空格、反斜杠和其他奇怪字符的文件名:
while read -r file; do rm -- "$file"; done < list.txt
这将读取 的每一行list.txt
,将其另存为$file
并运行rm
。 确保-r
反斜杠按字面意思读取(因此\t
匹配 a\
和 at
而不是 TAB)。 确保--
它还处理以 开头的文件名-
。
你也可以在 Perl 中这样做:
perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt
它将把每个文件名读入哈希值%k
,然后unlink
删除每个文件名。
答案3
通过python。
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
是一个输入文件,其中存储了您实际想要删除的文件的路径。
答案4
另一种方法是:
您可以通过将文件制作成 shell 脚本来‘准备’该文件:
$ 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