GNU/Linux >> Tutoriales Linux >  >> Linux

Bash:ls * sin agrupación de carpetas

No parece ser posible sin la alteración de la salida, pero aquí hay una forma alternativa fácil:

find source/ -type f

O (específico de la búsqueda de GNU), para obtener solo archivos en la profundidad de su pregunta:

find source/ -type f -mindepth 2 -maxdepth 2

(o si quieres directorios como ls te da, quita -type f )


Simplemente puede apegarse a ls si agrega algunos psicodélicos (ls -d ):

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

Te puede interesar “El find del pobre ”:

shopt -s globstar

shopt -s s Establece la(s) opción(es) de shell nombrada(s). El globstar la opción se define de la siguiente manera en bash(1):

Si se establece, el patrón ** utilizado en un contexto de expansión de nombre de archivo/ruta coincidirá con un archivo [sic] y cero o más directorios y subdirectorios. Si el patrón es seguido por un / , solo coinciden los directorios y subdirectorios.

Entonces, después de haber hecho shopt -s globstar , cualquiera de los siguientes comandos:

ls -d1 -- source/**                 # The character after the ‘d’ is the digit one.
ls -d -- source/** | cat            # i.e., it will write that into a pipe to any command.
printf "%s\n" source/**

producirá la salida:

source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png

Desafortunadamente, esto también incluye los nombres de los directorios. Podría ayudarte un poco saber que

printf "%s\n" source/**/

producirá la salida:

source/
source/fonts
source/images

es decir, solo los nombres de los directorios. Puede redirigir la salida de uno de los primeros conjuntos de comandos a un archivo, redirigir la salida del anterior a un segundo archivo y luego usar comm , diff , o algo similar, para restar el segundo archivo del primero, dejando solo los archivos sin formato (no directorios). Pero no hagas eso.

Otro enfoque (eso no es mucho mejor) es

ls -d --file-type -- source/** | grep -v '/$'

El --file-type opción dice ls para mostrar un / al final de cada nombre de directorio (y otros caracteres al final de otros tipos de archivo (especiales), así:

source//                            # Added an extra one
source/fonts/                       # Added one
source/fonts/fontello
source/images/                      # Added one
source/images/bg1.png
source/images/eng.png
source/images/fra.png

y luego el grep -v '/$' elimina las líneas que terminan en /;es decir, los nombres de los directorios. Desafortunadamente, el --file-type POSIX no especifica la opción. Si su versión de ls no es compatible, use -F . Eso es como --file-type excepto que también muestra un * al final de los nombres de los archivos ejecutables, que algunas personas encuentran molesto. Puedes eliminarlos con sed :

ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'

Si desea hacer algo con todos los archivos (y solo los archivos), puede hacerlo

for f in source/**
do
    if [ -f "$f" ]
    then
        Insert commands to be applied to plain files here.
    fi
done

Notas:

  • Cuando ls está enviando a una terminal, y no está en -l (l ong), escribe múltiples nombres por línea (a menos que los nombres sean muy largos). Puede obligarlo a escribir un nombre por línea especificando -1 (uno), o redirigiendo la salida a un archivo o una canalización.
  • Probablemente no necesites el -- en el ls comandos ya que está enumerando un directorio cuyos contenidos creó. Deberías usarlo cuando listes * en un directorio desconocido, como protección contra los nombres de archivo que comienzan con - .
  • No intente analizar la salida de ls .
  • El globstar La opción de shell parece no estar definida por POSIX. (De hecho, no estoy seguro de que POSIX reconozca cualquier opciones de shell). Si bien parece ser un bash ism, tenga cuidado, es posible que no esté presente en todas las versiones de bash.
  • Si fonts o images tiene subdirectorios, ** los enumerará a todos, recursivamente, hasta el final. Una forma (algo torpe y poco confiable) de limitar la profundidad es

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    que elimina las líneas que contienen tres o más / personajes.


Linux
  1. Extraiga el nombre base del archivo sin ruta y extensión en bash

  2. Historial de bash sin números de línea

  3. ¿Cómo extraigo archivos sin estructura de carpetas usando tar?

  4. clon de git sin carpeta de proyecto

  5. Ejecute todos los scripts de shell en la carpeta

Variable de exportación de bash

Comando de espera bash

Golpear mientras se repite

Bash Shebang

Cómo mostrar el historial de Bash sin números de línea

¿Cómo verifico la sintaxis de un script Bash sin ejecutarlo?