como listar arquivos de diretórios específicos

-1

Eu tenho uma lista de diretórios em um arquivo de texto pode qualquer um me dizer como listar arquivos apenas dentro dos diretórios que está no arquivo de texto

    
por mrr 12.02.2018 / 05:53

4 respostas

3

Você pode usar find e bash Substituição de comando para isso:

find $(</path/to/path_file) -type f

Isso simplesmente lista todos os f ile contidos em todos os diretórios mencionados em /path/to/path_file . Claro que você pode ajustar ainda mais a saída de find , por exemplo adicionando a opção -ls .

Exemplo de execução

$ tree
.
├── path_file
├── test1
│   ├── 1
│   └── 2
└── test2
    ├── 3
    └── 4
$ cat path_file
/path/to/test1
/path/to/test2
$ find $(</path/to/path_file) -type f
/path/to/test1/2
/path/to/test1/1
/path/to/test2/4
/path/to/test2/3

Estou usando caminhos absolutos aqui, por isso é irrelevante em qual diretório find é chamado. Se o path_file contiver caminhos relativos , você precisará chamá-lo no diretório correto - imagine todos os /path/to substituídos por . no exemplo acima.

Se os seus caminhos contiverem espaços, você pode definir o Separador de campos internos para a nova linha com IFS=$'\n' antes chamando find , desta forma apenas newline será visto como um limite entre os caminhos.

Se você quiser analisar todas as linhas, recomendamos enfaticamente que parallel permaneça com find :

parallel find {} -type f :::: /path/to/path_file

parallel trata os espaços em branco nos argumentos corretamente por design.

    
por dessert 12.02.2018 / 08:13
2

Há dois problemas aqui: um é muito simples - listar arquivos em diretórios e o outro pode ser um pouco mais problemático - ler a linha do arquivo por linha e passando linhas daquele arquivo como argumentos.

A maneira clássica de fazer isso é via while IFS= read -r loop e podemos adicionar outras coisas a ele

while IFS= read -r line || [ -n "$line" ] ; 
do 
    [ "x$line" = "x" ] && continue
    [ -d "./$line" ] && ls "./$line"
done < ./dirs.txt

Existem algumas coisas acontecendo:

  • IFS= read -r line parte lerá uma linha sem executar divisão de palavras ; Isso significa que, se você tiver <space><space>directory_name , ele será lido exatamente assim, em vez de directory_name .
  • ./ ao lado de verifica se o diretório mencionado existe em primeiro lugar e ls - que é para proteger de nomes de arquivos que podem começar com - . Nomes de arquivo como -directory podem ser mal interpretados por comandos como -d flag com o valor correspondente irectory para esse flag; é claro que isso levará a um erro se esse sinalizador não existir para o comando.
  • [ "x$line" = "x" ] && continue verificará a variável vazia / linha em branco. Se a variável estiver vazia, ls produzirá conteúdo para ./ , o que é um comportamento errado.

O caso recursivo da mesma coisa pode ser por meio de find , como mostra a sobremesa, ou por meio de globstar :

shopt -s globstar
while IFS= read -r line || [ -n "$line" ] ; do 
    [ "x$line" = "x" ] && continue
    [ -d "$line" ] &&
    for i in "$line"/** ; do 
        ls "$i"
    done
done < "/path/to/dirs.txt"
    
por Sergiy Kolodyazhnyy 12.02.2018 / 09:20
0

Este é um exemplo simples para fazer isso a partir da linha de comando:

ls 'cat ./dirs.txt'

Substitua "dirs.txt" pelo nome do arquivo que contém a lista de seus diretórios. O arquivo dirs.txt precisa estar no diretório de trabalho atual, a menos que você especifique o caminho para dirs.txt Para listar os arquivos uma tela por vez:

ls 'cat ./dirs.txt' | more

Isso será mais complicado Como Sergiy Kolodyazhnyy apontou nos comentários, isso não funcionará corretamente se o seu dirs.txt contiver um diretório com um espaço ou abas.

    
por stumblebee 12.02.2018 / 08:09
-1

Eu não sei exatamente o script, mas combinar um desses dentro de um loop for no script fará o que você quer fazer.

Para listar files only inside a directory , você pode fazer um desses

Usando ls

$ ls -p | grep -v / 

OR

$ ls -al | grep '^-'

Usando o find

$ find . -maxdepth 1 -type f
    
por C0deDaedalus 12.02.2018 / 06:47