Excluir un directorio en el patrón coincidente `ls`

13

Estoy tratando de lsdirectorios que tienen .pngarchivos dentro (sin necesidad de recursividad, aunque sería muy útil), excepto uno. Exluir un directorio, es decir

ls */*.png

funciona bien.

ls (^one)*/*.png

no devuelve stdout. ¿Cómo lo logro?

Estoy ciego y espeaklo entiendo, así que solo puedo escuchar stdout por ahora.

Tomás Jankus
fuente
¿Qué caparazón estás usando? Su patrón parece un patrón zsh, aunque no es útil, ya que no excluiría one(el patrón correcto sería ^one/*.png), imprimirá todo.
Gilles 'SO- deja de ser malvado'

Respuestas:

16

Opción 1 : usar solo ls:
con el bash globing extendido activado ( shopt -s extglob) puede hacer:

ls !(one*)/*.png


Opción 2 : combinación lsy grep:

Puedes combinar lscongrep -v

  • p.ej ls */*.png | grep -v "one/"


Opción 3 - (la mejor IMO) pero findno utiliza ls:

Para la búsqueda recursiva de todos los subdirectorios utilizando find

find . -type f -name "*.png" -not -path "*/one/*"


Todas las líneas anteriores enumerarán directorios con .pngarchivos mientras filtran cualquier coincidencia de ruta one/; solo la opción 3 hará esto de forma recursiva.

toxefa
fuente
¿El findcomando no necesita decir -path "*/one/*"o -path "./one/*"?
G-Man dice 'reinstalar a Mónica' el
@ G-Man Tienes toda la razón. Editado arriba.
toxefa
¿No coincidiría eso ./phone/handset.png?
G-Man dice 'reinstalar a Mónica' el
@ G-Man ¿Qué hay de malo en hacer coincidir .pngs en un directorio llamado phone? ¿Pensé que solo estábamos tratando de excluir one?
toxefa
1
Bueno, dado que lo está utilizando en relación con -not, significa que findexcluye los archivos en un directorio llamado phone.
G-Man dice 'reinstalar a Mónica' el
6

En zsh , pon setopt extended_globtu ~/.zshrc. Luego puede usar el patrón comodín ^one para excluir el directorio llamado one.

ls ^one/*.png

Si desea recurrir a subdirectorios, utilícelo **/para el engrosamiento recursivo. Para excluir el directorio llamado oneen el nivel superior, así como el directorio de nivel superior:

ls ^one/**/*.png

Para excluir archivos en un subdirectorio llamado one, pero no archivos en subdirectorios:

ls **/^one/*.png

Para excluir archivos en un subdirectorio llamado oneen cualquier nivel, use un patrón de repetición con el #operador alrededor de la negación:

ls (^one/)#/*.png
Gilles 'SO- deja de ser malvado'
fuente