Script Bash para recorrer carpetas y enumerar archivos en texto

Script Bash para recorrer carpetas y enumerar archivos en texto

Puedo hacer esto en secuencias de comandos CMD de Windows, pero ahora estoy ingresando a Debian a través de Raspberry Pi.

Lo que me gustaría hacer es...

(En la carpeta actual)

  • Para cada subcarpeta...
    • Cree un archivo llamado nombres_de_archivo_originales.txt
    • Repita el nombre de la carpeta en este original_filenames.txt
    • Enumere todos los archivos (incluidas las subcarpetas) en original_filenames.txt

Respuesta1

Usando un bucle de shell:

for dir in */; do
    { printf '%s\n' "$dir"
      ( cd "$dir" && find . )
    } >"$dir/original_filenames.txt"
done

Esto itera sobre todos los subdirectorios en el directorio actual. El cuerpo del bucle genera el nombre del directorio y luego una lista de todos los archivos y directorios, de forma recursiva, en ese directorio. Esta salida va al original_filenames.txtarchivo en el directorio.

Corta:

for dir in */; do
    find "$dir" >"$dir/original_filenames.txt"
done

Esto da un resultado ligeramente diferente en el sentido de que todos los nombres de ruta que se escriben en el archivo comienzan con el nombre de la subcarpeta.

Si no está interesado en los nombres de los directorios y solo desea las rutas de los archivos normales, utilice findwith -type fdespués del nombre del directorio.


Tenga en cuenta que si está planeandousandoSi genera archivos de salida para cualquier cosa, esto fallará (o al menos será muy problemático) si alguno de los nombres de ruta encontrados contiene nuevas líneas (lo cual es completamente posible en un sistema Unix).

Respuesta2

Podrías hacer esto con el findcomando y la execopción, algo como esto:

find . -type d \( ! -name . \) -exec bash -c '
    dirname=$(basename "{}") && 
    cd "{}" && 
    echo "{}" > original_filenames.txt && 
    ls | grep -Fv original_filenames.txt >> original_filenames.txt
' \;

Aquí hay una publicación de StackOverflow que puede resultarle útil:

información relacionada