Lista de archivos que no coinciden con la cadena dada en el nombre del archivo

16

Tengo un directorio en el que temp_log.$$se crean muchos archivos (alrededor de 200) con el nombre con varios otros archivos importantes que necesito verificar.

¿Cómo puedo enumerar fácilmente todos los archivos y excluirlos de la temp_log.$$visualización?

Rendimiento esperado

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

He pasado por la lspágina de manual pero no pude encontrar nada en esta referencia. Avíseme si me he perdido alguna información vital aquí.

Gracias

mtk
fuente
en BASH, ls --hide='temp_log.$$'debería funcionar. También podría / debería extender esto con comodines, dependiendo de qué parte del término completo temp_log.$$sea.
erch

Respuestas:

25

Con GNU ls(la versión en Linux y Cygwin no integrados, a veces también se encuentra en otros lugares), puede excluir algunos archivos al enumerar un directorio.

ls -I 'temp_log.*' -lrt

(tenga en cuenta la forma larga de -Ies --ignore='temp_log.*')

Con zsh, puede dejar que el shell realice el filtrado. Pase -da lspara evitar enumerar el contenido de los directorios coincidentes.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Con ksh, bash o zsh, puede usar la sintaxis de filtrado de ksh. En zsh, corre setopt ksh_globprimero. En bash, corre shopt -s extglobprimero.

ls -dltr !(temp_log.*)
Gilles 'SO- deja de ser malvado'
fuente
Por favor, no comillas simples en el ejemplo para GNU ls: ls -I 'temp_log. *' -Lrt Son necesarias para pasar el patrón al comando y no dejar que el shell lo expanda.
Shargors
En Ubuntu bash v4.3.48, debería quedar -Itemp_log.*sin espacio después del-I
Yan King Yin
1
@YanKingYin No, está bien tener un espacio después del -I. Sin embargo, *debe citarse de una forma u otra. -I temp_log.*pero no funciona -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, etc, son bien.
Gilles 'SO- deja de ser malvado'
10

Puedes usar grepcon la opción -v.

ls -lrt | grep -v <exclude-filename-part>
andrade
fuente
1
No estoy seguro de por qué esto fue rechazado, es la respuesta correcta.
Tim Kennedy el
55
Hacer un grep en la salida de ls no siempre es correcto y no se recomienda. Tiene efectos secundarios. No puedo recordar problemas exactos. Nota al
margen
1
Aquí está el enlace de por qué analizar ls es una mala idea .
mtk
3

Puedes usar findpara esto:

find . \! -name 'temp_log*'

Esto solo imprimirá los nombres, puede agregarlos -lspara crear una ls -lsalida de estilo con marca de tiempo y permisos, o usar -exec ls {} +para pasar a ls con las opciones que desee para columnas, clasificación, etc.

Escribí esto asumiendo que esto solo eran archivos en un directorio. Si el directorio contiene otros directorios, puede evitar enumerarlos recursivamente

find . \! -name 'temp_log*' -maxdepth 1

Y si usa ls, querrá pasar la opción -d para evitar que aparezca en los directorios:-exec ls -d {} +

Aleatorio832
fuente
Probablemente también quiera -maxdepth 1imitar no recursivo ls.
jw013
Agradable. Los usuarios que tienen un POSIX más mínimo findsin -maxdepth deben mirar aquí .
Comodín
2

Creo que quieres usar una función del shell, no de ls. Yo uso bash, así que busqué lo que quieres man bash. Busque "^ EXPANSION", (presionando primero '/'). Extracto:

EXPANSIÓN

    La expansión se realiza en la línea de comando después de que se ha dividido en palabras. Hay siete tipos de expansión lleva a cabo: la expansión de llaves , de tilde de expansión , los parámetros y la expansión de variables , sustitución de orden , expansión aritmética , la división de palabras , y la expansión de nombre de camino .

   ︙
... <recorte> ...
   ︙

Expansión de nombre de ruta

    Después de la división de palabras, a menos que el -f opción se ha establecido, fiesta escanea cada palabra de los personajes *, ?y [. Si aparece uno de estos caracteres, la palabra se considera un patrón y se reemplaza por una lista ordenada alfabéticamente de nombres de archivos que coinciden con el patrón. ...

Recientemente comencé a excluir archivos basados ​​en su primera letra, con un comando como:

$ ls ./[^t]*

Esto coincidiría con cualquier cosa que no comience con la letra t. Si agrega más caracteres entre los corchetes, también excluye los archivos que comienzan con esas letras.

Buscando un enlace, ¡y tengo uno bueno! Ver coincidencia de patrones . A partir de ahí, esto funcionaría para su caso:

$ ls -lrt ./!(temp_log.*)

Esto requiere que la extglobopción de shell esté habilitada usando el shoptbuiltin ( shopt -s extglob), como lo indica Gilles .

Alex Leach
fuente
-1

Solo haz

ls -ltr `grep -il patterntosearch  *`
user43658
fuente
grepbusca un patrón dentro de un archivo, en lugar de en el nombre del archivo.
evilsoup
-2

Dado que los archivos que NO desea imprimir tienen "temp_log". en el nombre del archivo, luego filtre con grep:

ls -lrt | grep -v "temp_log."

NOTA: La otra publicación con una respuesta similar probablemente fue rechazada porque el usuario no incluyó comillas "" alrededor de la cadena que grep debería estar buscando. Sin las comillas, no funciona como se anuncia.

usuario185160
fuente
Su 'NOTA' no es estrictamente correcta. Hay ciertos caracteres que podrían necesitar ser citados, pero no creo que haya ninguno en esa cadena en particular.
fuma2345
hasta que haya un usuario o grupo llamado "temp_log" (el punto en la expresión regular coincidiría con un espacio o cualquier cosa siguiente temp_log. Esta no es una buena forma (general) de excluir lsresultados.
Jeff Schaller
solo con -F@ smokes2345; un punto coincidirá con cualquier carácter en una expresión regular básica. Ver: unix.stackexchange.com/q/119905/117549
Jeff Schaller