2012-09-28 20 views
11

Possible Duplicate:
How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?Lista de todos los archivos que no coinciden con el selector (usando ls)

que he leído la página man para ls, y no puedo encontrar la opción de listar todos los que hacen no coincidir con el selector de archivos . ¿Sabes cómo realizar esta operación?

Por ejemplo: digamos mi directorio es la siguiente:

> ls 
a.txt b.mkv c.txt d.mp3 e.flv 

Ahora me gustaría hacer algo que hace lo siguiente

> ls -[SOME_OPTION] *.txt 
b.mkv d.mp3 e.flv 

¿Hay tal opción?

Si no es así, ¿hay alguna manera de conectar la salida de ls a otra función (posiblemente sed) que muestra solo las que me gustaría?

No sé exactamente cómo hacer esto, pero estoy imaginando que sería algo así como:

> ls | sed [SOMETHING] 

que realmente debería aprender a utilizar sed, awk y grep, pero sigo atascarse en comprender cómo escribir las expresiones regulares. Entiendo claramente el concepto de expresiones regulares, pero me confunden las expresiones regulares que usan una sintaxis diferente.

¡Cualquier ayuda sería muy apreciada!

EDIT:

me olvidó mencionar que estoy ejecutando Mac OS X, por lo que las funciones pueden ser ligeramente diferentes de los discutidos en otras respuestas a la Concha de Unix/Linux (por lo tanto algunos de mi confusión con sed, awk y grep).

Respuesta

16

tal vez este comando le ayudará a

find ./ -maxdepth 1 ! -path "*txt" 
+0

Esto funciona muy bien con muchos selectores diferentes como el parámetro 'path' ¡Gracias! Una cosa que encontré fue que podía hacer 'find. -maxdepth 1! -path" * txt "' también Ahora, ¿qué tendría que usar si tuviera un Regex para filtrar la lista? –

+0

if quieres usar Regex, usa grep. ej. tienes 3 archivos como "abc", usa ls | grep -v "[a | b]", luego mostrará c. y luego si tienes 3 archivos aa aaa, use "ls | grep -v "a +", entonces solo mostrará "a". –

+0

./ El argumento es opcional ya que el comando find ya comienza a buscar desde el árbol de directorios actual – kante

9
ls|grep -v ".txt" 

hace esto ayuda?

+0

Esto funciona para el caso que te di, pero realmente estoy buscando algo que funcione con cualquier selector. Por ejemplo, si no quería mostrar los que tenían el carácter 'x' seguido de la palabra' in', necesito usar el selector '* x * in *'. Esto no sería posible usando tu ejemplo, creo. –

+0

@KaushikShankar Creo que funcionará. Darle una oportunidad. –

3

Una forma usando find:

find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n" 
+0

¡Gracias por su respuesta! Lamentablemente, creo que puede haber un problema con la ejecución en Mac OS X. El error que obtengo es el siguiente: Comando: '> find. -maxdepth 1 -type f -not -name "* .txt" -printf "% f \ n" ' Error: ' 39m \ n "find: -printf: desconocido primario u operador' –

+0

@KaushikShankar: Sí, ignore el printf, solo ordenará su salida para proporcionar una lista de archivos similar a cómo funcionaría 'ls'. Parece que' BSD find' no lo entiende. – Steve

3

ls simplemente enumera cuáles son los argumentos que se le presenta. *.txt se expande a a.txt c.txt antes de ls lo ve, prueba echo *.txt.

Para hacer lo que piden con sed puede eliminar el patrón de su entrada, por ejemplo:

ls | sed '/\.txt$/d' 

eliminaría todas las líneas que terminan con .txt.

Con fiesta y zsh puede tener la cáscara de hacer la expansión invertida, la fiesta sería:

ls !(*.txt) 

zsh:

ls *~*.txt 

Tenga en cuenta que los dos conchas necesitan la opción glob extendida para habilitarse, shopt -s extglob con bash y setopt extendedglob con zsh.

+1

¡Gracias por mostrarme otra función de zsh! Es impresionante. –

34

esto puede ayudarle a

ls --ignore = *. Txt

No va a mostrar los archivos .txt en el directorio. esta es una respuesta precisa para su pregunta.

+1

Este me funcionó bien. Puede encadenar - ignorar interruptores juntos, y así ignorar, p. todos los archivos txt, todos los archivos que comienzan con aj y todos los archivos con un nombre que contiene 'bar': 'ls --ignore = *. txt --ignore = j * --ignore = * bar *' –

+0

Recibo una opción ilegal cuando usar eso en El Capitan ls --ignore = * pdf ls: opción ilegal - - uso: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [archivo ...] –

+1

Gracias. ¡En realidad, esta debería ser la respuesta aceptada! – Veera

Cuestiones relacionadas