如何删除文本文件中列出的文件
我有一个文本文件,其中包含各种文件的路径列表。 是否有一个我可以使用的命令将遍历每一行并删除指定路径上的文件?
使用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
删除它们中的每一个。
通过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
是一个输入文件,其中存储了您实际要删除的文件的路径。
傻,但这里有一个:
tar -cvf /dev/null --remove-files -T filename
另一种方法:
您可以通过将其作为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
据我所知,你有一个文本文件,其中包含完整路径的文件。 有两种可能性:
-
您的列表的文件名由换行符分隔,即每行包含文件的完整路径。 在这种情况下:这是一个简单的出路:
for i in $(cat listOfFiles.txt); do rm -f $i done
-
如果您的列表有一行或多行文件名,用空格或制表符分隔,那么这是演练:
sed -i 's/\s\+/\n/g' listOfFiles.txt
这会将所有空格转换为换行符
for i in $(cat listOfFiles.txt); do rm -f $i done
是的,有很多方法可以完成它,但这是一种非常简单的方法。