Como pode enumerar todos os arquivos no diretório, excluir por padrão.
Por exemplo: todos os *.pdf excluem *_book.pdf. Eu tento assim:
for $PDF in $(ls *.pdf | grep -v *_book.pdf);
do
echo "File $PDF"
done
É um bom caminho? Existem outras maneiras? Usadosedeclaração ou outra.
Responder1
Além disso, a variável que você declara no for
loop não deve ter cifrão. O cifrãointerpolao valor de uma variável; então $PDF
é lido como "o valor atual da variável cujo nome é PDF
".
for PDF in *.pdf
do
case $PDF in
*_book.pdf) continue;;
esac
echo "File $PDF"
done
A case
sintaxe assusta alguns iniciantes, mas eu prefiro isso if
para coisas assim. Mas se preferir, você pode usar
if [[ $PDF =~ _book\.pdf$ ]]; then
continue
fi
ou a abreviatura
[[ $PDF =~ _book\.pdf$ ]] && continue
case
tem o benefício adicional de ser portátil para POSIX sh
e até mesmo para o bom e velho Bourne original sh
.
Observe que o padrão in case
é um glob, while [[ $variable =~ regex ]]
usa uma expressão regular (portanto, não deve haver *
before _book
).
Responder2
Usando shopt -s extglob
(que pode ser um padrão em seu sistema, caso contrário, configure-o), você pode usar correspondência estendida e isso inclui padrões de correspondência negativos:
# Directry contents
>ls -1
1_book_not.pdf
1_book.pdf
1.pdf
1.txt
# With negative match
>ls -1 !(*_book).pdf
1_book_not.pdf
1.pdf
Responder3
Você teve um pequeno erro de sintaxe na sua for
expressão. Em vez disso, tente o seguinte:
for PDF in $(ls *.pdf | grep -v *_book.pdf);
do
echo "File $PDF"
done
Isso parece funcionar bem.
Responder4
Outra opção é usar find
:
find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'
Por exemplo, considere um diretório com estes quatro arquivos:
$ ls
a_book.pdf book.txt nook.pdf not_book1.pdf
Agora, execute nosso comando:
$ find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'
./not_book1.pdf
./nook.pdf
Como funciona
find .
diz ao find para iniciar uma pesquisa no diretório atual.-maxdepth 1
diz ao find para pular subdiretórios.-name '*.pdf'
diz ao find para procurar arquivos cujos nomes terminam em if.pdf
.! -name '*_book.pdf'
diz ao find para excluir da saída qualquer arquivo cujo nome termine com_book.pdf
.