Como reunir o nome dos arquivos em cada subdiretório em um arquivo de texto nesse subdiretório?

1

Eu queria salvar os nomes de todos os arquivos em cada subdiretório em um arquivo de texto nesse subdiretório, então eu escrevi este script:

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

mas não consigo inserir subdiretórios usando:

cd "$X"

O que está errado aqui?

    
por Ali 19.05.2016 / 13:16

4 respostas

1

Por seus comentários, você só precisa descer um nível de profundidade. Nesse caso, você poderia usar um glob para iterar nomes de diretórios e para cada dir salvar os caminhos de arquivo em uma matriz e, em seguida, imprimir o último elemento de cada caminho para fileNames.txt :

#!/bin/sh

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

Para excluir links simbólicos, basta adicionar uma condição. if [[ ! -L "${dir%?}" ]]; then arr...

    
por 19.05.2016 / 14:37
1

Você precisa cd de cada subdiretório antes de tentar o próximo. Inserindo ...

cd ..

no final do loop, isso seria corrigido para os subdiretórios, mas será interrompido quando você fizer isso no primeiro diretório. Um cd .. de lá o levará para outro nível, então os outros diretórios não são mais visíveis.

Você pode resolver tudo isso salvando o diretório principal em uma variável e cd para 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

Você também pode querer alterar >> para > , se não quiser manter todos os resultados das execuções anteriores.

    
por 19.05.2016 / 14:27
0
#!/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 ;

Pode ser que o que você está tentando alcançar possa ser generalizado usando find - usando opções adicionais ( man find ) para cada $X - como:

files=$(find ${PWD} -type f) ;
printf "$files\n" >> filesNames.txt ;
    
por 19.05.2016 / 13:43
0

Tente isso:

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

Isso encontra todos os diretórios abaixo do diretório atual e, para cada um, ele cd s no diretório e grava o diretório listando em filesNames.txt (excluindo esse arquivo da lista).

Se você quiser que os arquivos filesNames.txt também estejam nas listas, remova o | grep -v ... do comando:

find . -type d -exec sh -c "cd {} ; ls > filesNames.txt" \;
    
por 20.05.2016 / 03:56