¿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
Además, la variable que declares en el for
bucle no debe tener un signo de dólar. el signo del dolarinterpolael valor de una variable; entonces $PDF
se 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 case
sintaxis asusta a algunos principiantes, pero yo la prefiero if
para cosas como esta. Pero si lo prefieres, puedes utilizar
if [[ $PDF =~ _book\.pdf$ ]]; then
continue
fi
o la taquigrafía
[[ $PDF =~ _book\.pdf$ ]] && continue
case
tiene el beneficio adicional de que es portátil a POSIX sh
e incluso al antiguo Bourne original sh
.
Observe que el patrón case
es 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 for
expresió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 1
le 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
.