尝试编写脚本从文本文件中的通配符中删除文件

尝试编写脚本从文本文件中的通配符中删除文件

我正在尝试编写脚本来删除文件名与文本文件中的通配符匹配的文件。

我正在使用以下内容

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"

文件中list有几行

file*
test*

如果我运行这个,我会得到以下结果

rm: cannot remove ‘file*’: No such file or directory
rm: cannot remove ‘test*’: No such file or directory

我认为 * 不能用于删除以下文件

file 1
file2
file2.txt
test 001 more teskt.txt

抱歉,我不是 Linux 专家。也许有人有简单的答案,也许用其他东西替换 *?

答案1

路径名扩展发生在变量扩展之后,但仅限于命令行中未引用的部分。

rm -- $line  # <- no double quotes to expand wildcards

这对于包含空格的文件名不起作用,因为在变量扩展之后也会发生单词拆分。

您可以使用 Perl 来扩展 glob:

perl -lne 'unlink glob' -- list.txt

普通的全局需要空格反斜杠,但你可以切换到文件::Glob如果对您来说更方便,可以选择不同的行为:

perl -MFile::Glob=:bsd_glob -lne 'unlink glob' -- list.txt

答案2

寻找

如果您仅删除 pwd 中的文件(如问题中所述),您可以rmfind -name这样替换:

find . -maxdepth 1 -name "$line"

这只会输出与 glob 匹配的文件名。如果输出看起来不错,请-delete在末尾添加。


Python

对于上述解决方案未涵盖的任何内容find,这应该有效:

python3 -c 'import glob, os, sys; [print(f) for f in glob.glob(sys.argv[1])]' "$line"

如果输出看起来不错,则替换printos.remove

或者你可以用 Python 编写整个脚本:

#!/usr/bin/env python3
'''
For each line from "fileinput", treat it as a glob and delete
the matching files.
'''

import fileinput
import glob
import os

for line in fileinput.input():
    line = line.rstrip('\n')
    for file in glob.glob(line):
        # If the output looks good, replace "print" with "os.remove"
        print(file)

但请注意,如果没有给出参数,fileinput则从标准输入读取而不是出错。

相关内容