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 findo grep.

lsvsfindvs globbing puede diferir para los archivos de puntos ocultos.findatravesará subdirectorios, como un recursivols. Use-maxdepth 1confindpara 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
lsopciones de GNU no son portátiles.lsde 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
-oNecesita 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?findmanual, 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
bashglobbing 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
-dpara evitar eso:ls -d !(*.txt|*.pdf)En
zshconextendedglob: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)
findadmiten el-print0predicado 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 -r0conjuntamente con find's-print0Por 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
tarsiguiente manera:Esto crea un archivo tar.gz de todos los archivos cuyos nombres no terminan en .tar.gz
rsynctambién acepta archivos delimitados por nulos con el-0parámetro, al igual que muchos otros. Peroxargses el pegamento que usualmente usarás para este tipo de propósito. O eso ofindla-execcaracterística.fuente
tarejemplo de comando es bueno. Sin embargo, para la mayoría de los propósitos,-execse 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