Enumerar archivos *.pdf excluir *_book.pdf

Enumerar archivos *.pdf excluir *_book.pdf

¿Cómo se pueden enumerar todos los archivos en el directorio y excluirlos por patrón?

Por ejemplo: todos los *.pdf excluyen *_book.pdf. Lo intento así:

for $PDF in $(ls *.pdf | grep -v *_book.pdf);
do
   echo "File $PDF"
done

¿Es una buena manera? ¿Hay otras maneras? Usadosideclaración u otra.

Respuesta1

No lo use lsen guiones.

Además, la variable que declares en el forbucle no debe tener un signo de dólar. el signo del dolarinterpolael valor de una variable; entonces $PDFse lee como "el valor actual de la variable cuyo nombre es PDF".

for PDF in *.pdf
do
    case $PDF in
     *_book.pdf) continue;;
    esac
    echo "File $PDF"
done

La casesintaxis asusta a algunos principiantes, pero yo la prefiero ifpara cosas como esta. Pero si lo prefieres, puedes utilizar

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

o la taquigrafía

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

casetiene el beneficio adicional de que es portátil a POSIX she incluso al antiguo Bourne original sh.

Observe que el patrón casees un globo, mientras que [[ $variable =~ regex ]]usa una expresión regular (por lo que no debería haber *before _book).

Respuesta2

Usando shopt -s extglob(que podría ser un valor predeterminado en su sistema; de lo contrario, configúrelo), puede usar la coincidencia extendida y esto incluye patrones de coincidencia 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

Respuesta3

Tuviste un ligero error de sintaxis en tu forexpresión. Pruebe lo siguiente en su lugar:

for PDF in $(ls *.pdf | grep -v *_book.pdf);
do
   echo "File $PDF"
done

Esto parece funcionar bien.

Respuesta4

Otra opción es utilizar find:

find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'

Por ejemplo, considere un directorio con estos cuatro archivos:

$ ls
a_book.pdf  book.txt  nook.pdf  not_book1.pdf

Ahora, ejecuta nuestro comando:

$ find . -maxdepth 1 -name '*.pdf' ! -name '*_book.pdf'
./not_book1.pdf
./nook.pdf

Cómo funciona

  • find .le dice a find que inicie una búsqueda en el directorio actual.

  • -maxdepth 1le dice a find que omita subdirectorios.

  • -name '*.pdf'le dice a find que busque archivos cuyos nombres terminen en if .pdf.

  • ! -name '*_book.pdf'le dice a Finds que excluya de la salida cualquier archivo cuyo nombre termine en _book.pdf.

información relacionada