Enumerar arquivos *.pdf excluir *_book.pdf

Enumerar arquivos *.pdf excluir *_book.pdf

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

Não use lsem scripts.

Além disso, a variável que você declara no forloop 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 casesintaxe assusta alguns iniciantes, mas eu prefiro isso ifpara coisas assim. Mas se preferir, você pode usar

    if [[ $PDF =~ _book\.pdf$ ]]; then
        continue
    fi

ou a abreviatura

    [[ $PDF =~ _book\.pdf$ ]] && continue

casetem o benefício adicional de ser portátil para POSIX she 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 forexpressã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 1diz 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.

informação relacionada