Попытка к сценарию, удаляя файлы из подстановочных знаков в текстовом файле

Я пробую к сценарию, удаляя файлы, имена файлов которых соответствуют подстановочным знакам в текстовом файле.

Я использую следующее

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. Возможно, у кого-то есть легкий ответ, возможно, замените * чем-то?

6
задан 27 September 2018 в 12:46

2 ответа

Расширение пути происходит после переменного расширения, но только на неупомянутых частях командной строки.

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
7
ответ дан 23 November 2019 в 07:37

Найти

Если Вы только удаляете файлы в pwd (как в вопросе), можно заменить rm с find -name как это:

find . -maxdepth 1 -name "$line"

Это справедливые выходные имена файлов, которые соответствуют шарику. Если вывод выглядит хорошим, добавить -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 чтения от stdin вместо erroring.

1
ответ дан 23 November 2019 в 07:37

Другие вопросы по тегам:

Похожие вопросы: