¿Cómo elijo archivos específicos en un directorio diferente usando bash?

13

Quiero enumerar (o eliminar, o hacer alguna otra operación) en ciertos archivos en un directorio, como este:

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

¿Cómo puedo lograr esto (sin cd-ing al directorio primero)?

neu242
fuente

Respuestas:

22

Use llaves para ello:

ls /opt/somedir/{aa,bb,cc}

Para obtener más información, lea sobre la expansión de llaves .

prisa
fuente
3

En bash, ejecute shopt -s extglob(o póngalo en su ~/.bashrc), y puede usar patrones adicionales que proporcionan expresiones regulares con una sintaxis inusual (heredada de ksh). También puede usar estos patrones en ksh, por supuesto, y también en zsh después setopt ksh_glob.

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

En zsh, puede usar directamente (foo|bar)como patrón.

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Tenga en cuenta que el comando se llama con la ruta completa. Si desea llamar al comando con una ruta corta, deberá cambiar el directorio de alguna manera, y (cd /opt/somedir && somecommand aa bb cc)es, con mucho, la forma más fácil.

Gilles 'SO- deja de ser malvado'
fuente
Si se mira de cerca, verá que puedo especificar "sin CD-ción al directorio primera" en mi pregunta;)
neu242
1

Puedes filtrar usando egrep:

ls | egrep '(aa|bb|cc)'

Para buscar todos los archivos de texto:

ls | egrep '(aa|bb|cc).txt'
Oceano
fuente
1
dot coincidirá con todos los caracteres, y este enfoque hace que sea más difícil operar en estos archivos
enzotib
1
Tuve la sensación de que ls era solo un comando de ejemplo, también.
Random832
Sí, tienes razón, especifiqué que quiero realizar una operación: enumerar archivos fue solo un ejemplo.
neu242
Buenos comentarios queridos amigos, gracias. Buena suerte neu242: D
Ocean
1

Primero, te dirijo a: nunca analices ls , nunca . La forma correcta y canónica de hacer lo que quieres es con find .

Por ejemplo:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

Usualmente uso en -namelugar de -regexporque es más simple. Pero una expresión regular se adapta a su caso de uso. Debe ejecutar el comando sin -exec la primera vez, para asegurarse de que realmente sean los archivos que desea mover / eliminar.

Spencer Rathbun
fuente
Nunca dije que analizaría ls, y Rush tenía una respuesta mucho mejor. Gracias por intentarlo, sin embargo :)
neu242