Я пробую к сценарию, удаляя файлы, имена файлов которых соответствуют подстановочным знакам в текстовом файле.
Я использую следующее
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. Возможно, у кого-то есть легкий ответ, возможно, замените * чем-то?
Расширение пути происходит после переменного расширения, но только на неупомянутых частях командной строки.
rm -- $line # <- no double quotes to expand wildcards
Это не работало бы на имена файлов, содержащие пробелы, поскольку слово, разделяющее также, происходит после переменного расширения.
Можно использовать Perl для расширения шариков:
perl -lne 'unlink glob' -- list.txt
Нормальному шарику нужен пробел backslashed, но можно переключиться на File::Glob для другого поведения, если это более удобно для Вас:
perl -MFile::Glob=:bsd_glob -lne 'unlink glob' -- list.txt
Если Вы только удаляете файлы в pwd (как в вопросе), можно заменить rm
с find -name
как это:
find . -maxdepth 1 -name "$line"
Это справедливые выходные имена файлов, которые соответствуют шарику. Если вывод выглядит хорошим, добавить -delete
в конце.
Для чего-либо не покрытого 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
чтения от stdin вместо erroring.