Перебрать файлы и исключить файлы с определенным шаблоном имени Shell

вы можете либо создать один сценарий для каждого поддерживаемого вами дистрибутива, либо, если вы хотите предложить только один сценарий для всех, вам нужно будет определить версию ОС в вашем сценарии, чтобы затем выбрать, хотите ли вы запускать apt, yum или другой

0
01.04.2021, 08:43
2 ответа

Вы можете составить строку со всеми возможными комбинациями:

all=:
for thing in *test[0-9].txt work-.*; do
    all=$all$thing:
done
if [[ "$all" == *:"$file":* ]]; then
    # it is in the list
1
28.04.2021, 22:54
if test "$file" != "test[0-9].txt" -o "$file" != "work-.*"

Утилита testне выполняет сопоставление с образцом. Для этого вам понадобится конструкция Ksh/Bash/Zsh [[ ]](и, по крайней мере, в Bash шаблон не должен заключаться в кавычки ). Так:

for file in *; do 
    if [[ "$file" != test[0-9].txt && "$file" != work-.* ]]; then 
        echo "$file"
    fi 
done 

напечатает hello.txt, если он существует, но не test1.txtили work-.foo.

Обратите внимание, что вам нужны и вместо или , так как (x ≠ a или x ≠ b )будет соответствовать любому x.

См.:

В строгом POSIX sh вам нужно будет использовать caseдля сопоставления с шаблоном:

for file in *; do 
    case $file in
        test[0-9].txt|work-.*) false;;
        *) echo "$file";;
    esac
done 

Обратите внимание: если вы хотите сопоставить несколько цифр после test, как в test123.txt, вам потребуются расширенные подстановочные знаки в стиле ksh иtest+([0-9]).txtshopt -s extglobв Bash, чтобы они работали во всех контекстах ). Хотя, как отмечает Кусалананда, если вы идете этим путем, вы можете:

for file in !(test[0-9].txt|work-.*); do
    echo "$file"
done
2
28.04.2021, 22:54

Теги

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