Script Bash para percorrer pastas e listar arquivos para texto

1

Estou com dificuldades de pensar na BASH, posso fazer algumas sugestões.

Eu posso fazer isso no script Windows CMD, mas agora estou entrando no Debian via Raspberry Pi.

O que eu gostaria de fazer é ...

(na pasta atual)

  • Para cada subpasta ...
    • Crie um arquivo chamado original_filenames.txt
    • Eco o nome da pasta para este original_filenames.txt
    • Listar todos os arquivos (incluindo quaisquer subpastas) para original_filenames.txt

Obrigado pelo seu tempo.

    
por Murgatroyd 30.05.2018 / 20:23

2 respostas

1

Usando um loop de shell:

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

Isso itera sobre todos os subdiretórios no diretório atual. O corpo do loop produz o nome do diretório e, em seguida, uma lista de todos os arquivos e diretórios, recursivamente, nesse diretório. Essa saída vai para o arquivo original_filenames.txt no diretório.

Mais curto:

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

Isso gera um resultado ligeiramente diferente, pois os nomes dos caminhos que são gravados no arquivo começam todos com o nome da subpasta.

Se você não estiver interessado em nomes de diretório e quiser apenas nomes de caminho dos arquivos regulares, use find com -type f após o nome do diretório.

Note que se você está planejando usar os arquivos gerados para qualquer coisa, então isto irá falhar (ou pelo menos ser muito problemático) se algum dos caminhos encontrados contiver novas linhas (o que é inteiramente possível em um sistema Unix).

    
por 30.05.2018 / 21:27
0

Você poderia fazer isso com o comando find e a opção exec - algo assim:

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

Aqui está uma postagem do StackOverflow que você pode achar útil:

por 30.05.2018 / 20:54