我正在尝试编写脚本来删除文件名与文本文件中的通配符匹配的文件。
我正在使用以下内容
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
答案2
寻找
如果您仅删除 pwd 中的文件(如问题中所述),您可以rm
像find -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"
如果输出看起来不错,则替换print
为os.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
则从标准输入读取而不是出错。