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

Mar*_*rco 6 command-line bash scripts

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

我正在使用以下

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"
Run Code Online (Sandbox Code Playgroud)

在文件中list有行

file*
test*
Run Code Online (Sandbox Code Playgroud)

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

rm: cannot remove ‘file*’: No such file or directory
rm: cannot remove ‘test*’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我认为 * 不被接受来删除文件,例如

file 1
file2
file2.txt
test 001 more teskt.txt
Run Code Online (Sandbox Code Playgroud)

抱歉,我不是 linux 专家。也许有人有一个简单的答案,也许用某些东西替换 * ?

cho*_*oba 7

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

rm -- $line  # <- no double quotes to expand wildcards
Run Code Online (Sandbox Code Playgroud)

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

您可以使用 Perl 来扩展 globs:

perl -lne 'unlink glob' -- list.txt
Run Code Online (Sandbox Code Playgroud)

普通glob需要空格反斜杠,但如果对您更方便,您可以切换到File::Glob以获得不同的行为:

perl -MFile::Glob=:bsd_glob -lne 'unlink glob' -- list.txt
Run Code Online (Sandbox Code Playgroud)