¿Cómo recopilar el nombre de los archivos de cada subdirectorio en un archivo de texto en ese subdirectorio?

¿Cómo recopilar el nombre de los archivos de cada subdirectorio en un archivo de texto en ese subdirectorio?

Quería guardar los nombres de todos los archivos en cada subdirectorio en un archivo de texto en ese subdirectorio, así que escribí este script:

#!/bin/bash
for X in "$PWD" *
do  
    if [ -d "$X" ];
    then
        cd "$X"
        files="$(ls)"
        echo "$files" >> filesNames.txt
    fi
done

pero no puedo ingresar a subdirectorios usando:

cd "$X"

¿Que esta mal aquí?

Respuesta1

Según tus comentarios, solo tienes que descender un nivel de profundidad. En ese caso, podría usar un globo para iterar sobre los nombres de los directorios y para cada directorio guardar las rutas de los archivos en una matriz, luego imprimir el último elemento de cada ruta en fileNames.txt:

#!/bin/sh

for dir in "$PWD"/*/; do
arr=( "$dir"* )
printf %s\\n "${arr[@]##*/}" > "$dir"filesNames.txt
done

Para excluir enlaces simbólicos simplemente agregue una condición, por ejemploif [[ ! -L "${dir%?}" ]]; then arr...

Respuesta2

Debe cdsalir de cada subdirectorio antes de intentar con el siguiente. Insertando...

cd ..

al final del ciclo solucionaría este problema para los subdirectorios, pero se interrumpe cuando lo hace primero en el directorio superior. A cd ..desde allí lo llevará a otro nivel, por lo que los otros directorios ya no serán visibles.

Puede solucionar todo esto guardando el directorio superior en una variable y cdallí cada vez:

#!/bin/bash

TOPDIR="$PWD"
for X in "$PWD" * ; 
do
        if [ -d "$X" ] ;
        then
                cd "$X"
                files="$(ls)"
                echo "$files" >> filesNames.txt
                cd "$TOPDIR"
        fi
done

Es posible que también desee cambiar >>a >, si no desea conservar todos los resultados de ejecuciones anteriores.

Respuesta3

#!/bin/bash
for X in $PWD/* ; do
        if [ -d "$X" ] ; then # first depth directories
                cd "$X" ;
                files="$(ls)" ;
                printf "$files\n" >> filesNames.txt ;
        else # regular files:
                printf "$X\n" >> fileNames.txt ;
        fi ;
done ;

Puede ser que lo que estás tratando de lograr se pueda generalizar usando find- usando opciones adicionales ( man find) para cada uno $X- como por ejemplo:

files=$(find ${PWD} -type f) ;
printf "$files\n" >> filesNames.txt ;

Respuesta4

Pruebe esto en su lugar:

find . -type d -exec sh -c "cd {} ; ls | grep -v '^filesNames.txt$' > filesNames.txt" \;

Esto busca todos los directorios debajo del directorio actual y, para cada uno, ingresa cdal directorio y escribe la lista del directorio en filesNames.txt(excluyendo ese archivo de la lista).

Si desea que los filesNames.txtarchivos también estén en las listas, elimine el | grep -v ...del comando:

find . -type d -exec sh -c "cd {} ; ls > filesNames.txt" \;

información relacionada