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


23

我有一个文本文件,其中包含各种文件的路径列表。我是否可以使用一条命令来遍历每一行并删除指定路径下的文件?

Answers:


33

用途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
答案很干净,但cat不是必须的,您可以使用stdin重定向:< file xargs rm
kos 2015年

它拆分文件夹名称,然后寻找它们。例如,我的文件夹被解释为“我的”和“文件夹”?
达卡

@sudoman答案已更新。
埃里克·卡瓦略

如果文件没有空格,则可以在bash中使用“ rm-$(cat文件)”,cat file在(ba)sh或csh中使用“ rm-”。
士兵

如前所述cat,@ shooper 是无用的,请利用stdin!看看他的最新答案
kos 2015年

20

这是一种可以处理带有空格,反斜杠和其他奇怪字符的文件名的方法:

while read -r file; do rm -- "$file"; done < list.txt

它将读取的每一行list.txt,另存为$filerm在其上运行。的-r确保反斜杠字面上读(使得\t相匹配的\t,而不是一个TAB)。将--确保它也处理文件名开头-

您也可以在Perl中执行此操作:

perl -lne '$k{$_}++; END{unlink for keys(%k)}' list.txt

这个将把每个文件名读%k入哈希,然后用于unlink删除每个文件名。


10

通过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 是一个输入文件,实际要删除的文件的路径存储在该文件中。


6
嗯,至少您有胆量发布python答案:)
Jacob Vlijm 2015年

3

傻了,但这是一个:

 tar -cvf /dev/null --remove-files -T filename

2

另一种方法是:

您可以通过使它成为外壳脚本来“准备”文件:

$ 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

1

据我了解,您有一个文本文件,其中包含具有完整路径的文件。有两种可能性:

  1. 您的列表中的文件名用换行符分隔,即每行都有文件的完整路径。在这种情况下:这是一个简单的解决方法:

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    
  2. 如果列表中包含一行或多行文件名,且文件名之间用空格或制表符分隔,则进行以下钻取:

    sed -i 's/\s\+/\n/g' listOfFiles.txt
    

    这会将所有空格转换为换行符

    for i in $(cat listOfFiles.txt); do
        rm -f $i
    done
    

是的,有很多方法可以完成它,但这是一个非常简单的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.