如何删除文本文件中列出的文件

如何删除文本文件中列出的文件

我有一个文本文件,其中列出了各种文件的路径。是否有命令可以迭代每一行并删除指定路径下的文件?

答案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

相关内容