Lista de arquivos na hierarquia de diretório

1

Eu preciso listar arquivos na hierarquia do diretório. Para isso eu escrevi o script como

foreach file ( * )
    ls ${file}/*/*/*/*/*.root > ${file}.txt
end

Mas para isso eu tenho que saber que no diretório $ {file} existem 4 diretórios. Então, existe alguma maneira pela qual eu possa generalizar este script, de tal forma que eu não precisei ter idéia de quantos subdiretórios estão presentes?

    
por ramkrishna 06.09.2015 / 22:21

2 respostas

1

Use o comando find .

foreach file ( * )
    find ${file} -name "*.root" > ${file}.txt
end

Considere usar um shell diferente de csh, que está obsoleto há cerca de 20 anos. Use zsh ou bash interativamente, e não use csh para scripts .

    
por 07.09.2015 / 01:00
2

Quase todos os csh s encontrados atualmente são tcsh Se você estiver usando tsh 6.18.00 (20120114) ou mais recente, poderá usar ** (verifique com tcsh --version ):

ls "${file}"/**/*.root

Isso só funcionará se a variável globstar estiver definida:

set globstar

Preencha os documentos de tcsh(1) :

The globstar shell variable can be set to allow ** or *** as a file glob pattern that matches any string of characters including /, recursively traversing any existing sub-directories. For example, ls **.c will list all the .c files in the current directory tree. If used by itself, it will match zero or more sub-directories (e.g. ls /usr/include/**/time.h will list any file named time.h in the /usr/include directory tree; ls /usr/include/**time.h will match any file in the /usr/include directory tree ending in time.h; and ls /usr/include/**time**.h will match any .h file with time either in a subdirectory name or in the filename itself). To prevent problems with recursion, the ** glob-pattern will not descend into a symbolic link containing a directory. To override this, use *** (+)

    
por 06.09.2015 / 23:28