Supongamos que tengo una carpeta que contiene .txt , .pdf y otros archivos. Me gustaría enumerar los "otros" archivos (es decir, archivos que no tienen las extensiones .txt o .pdf ). ¿Tienes algún consejo sobre cómo hacer esto?
Sé cómo enumerar archivos que no tienen una extensión determinada. Por ejemplo, si quiero enumerar todos los archivos excepto los archivos .txt , entonces
find -not -iname "*.txt"
o
ls | grep -v '\.txt$' | column
parece funcionar Pero, ¿cómo puedo enumerar todo excepto los archivos .txt o .pdf ? Parece que necesito usar algún tipo de "o" lógico en find
o grep
.
ls
vsfind
vs globbing puede diferir para los archivos de puntos ocultos.find
atravesará subdirectorios, como un recursivols
. Use-maxdepth 1
confind
para que se comporte másls
.Respuestas:
Suponiendo que uno tenga una versión apropiada de
ls
, esta es posiblemente la forma más simple:Si desea recorrer en iteración todos los subdirectorios:
fuente
ls
opciones de GNU no son portátiles.ls
de todos modos no pertenece realmente a los scripts portátiles, así que he estado asumiendo que el OP solo pregunta sobre el uso interactivo.Encuentra apoyos
-o
Necesita el paréntesis para que la precedencia sea correcta. Find hace muchas cosas; Sugiero leer a través de su página de manual.
También puede hacer un o en
grep
(pero realmente, no debe analizar la salida dels
)fuente
ls
?find
manual, recomiendo de todo corazón los artículos sobre Unix Power Toolsfind
, como docstore.mik.ua/orelly/unix3/upt/ch09_06.htm y docstore.mik.ua/orelly/unix3/upt/ch09_12.htmfind . NOT ( *.txt OR *.pdf )
Con
bash
globbing extendido (activar conshopt -s extglob
), el glob!(*.txt|*.pdf)
debería funcionar. Puede pasar este globo directamente a cualquier comando que tome argumentos de archivo, incluidos, entre otrosls
.fuente
-d
para evitar eso:ls -d !(*.txt|*.pdf)
En
zsh
conextendedglob
:o
O con
kshglob
(sí, eso es ksh globbing no "bash extended globbing"):Sin embargo, recuerde que también excluyen los archivos de puntos.
ksh93 tiene la característica
FIGNORE
(mis):fuente
Esto es equivalente al comando con el operador OR, debido a las leyes de De Morgan .
fuente
Según lo sugerido por derobert, su mejor opción es usar
find
. Sin embargo, de hecho , puede utilizar el resultado en una tubería con otros comandos.GNU (y algunos BSD)
find
admiten el-print0
predicado que le dice que imprima el nombre de archivo terminado por un carácter NUL , cuyo carácter no está permitido dentro de un nombre de archivo y garantiza que no habrá una colisión. Se pueden indicar otros comandos para usar el NUL como su delimitador de entrada.El más importante de los cuales es GNU
xargs
, que ejecuta el comando que especifique y le pasa la lista de archivos como argumentos de línea de comando. Desea ejecutarxargs -r0
conjuntamente con find's-print0
Por ejemplo:Esto imprime de forma segura una lista larga de todos los archivos pdf y txt , incluidos aquellos con espacios o caracteres no imprimibles en el nombre.
También puede usarlo con GNU de la
tar
siguiente manera:Esto crea un archivo tar.gz de todos los archivos cuyos nombres no terminan en .tar.gz
rsync
también acepta archivos delimitados por nulos con el-0
parámetro, al igual que muchos otros. Peroxargs
es el pegamento que usualmente usarás para este tipo de propósito. O eso ofind
la-exec
característica.fuente
tar
ejemplo de comando es bueno. Sin embargo, para la mayoría de los propósitos,-exec
se ajusta mejor.Si no tienes un subdirectorio
también debería funcionar!
Pero
Es la forma común.
fuente
Como complemento, si usa un shell compatible con bash, puede usar la variable GLOBIGNORE para excluir los resultados de la coincidencia de patrones. Del hombre:
En tu caso particular:
Tenga en cuenta que ejecuto ese comando como un sub-shell (usando paréntesis) para no alterar la variable de entorno GLOBIGNORE de mi shell interactivo.
fuente