Unix: verifica se o arquivo é uma pasta

3

Então eu preciso percorrer uma árvore de diretórios, atualmente eu posso imprimir todos os arquivos em um diretório, mas uma vez que isso é feito eu preciso ser capaz de ir para as subpastas do diretório inicial e assim por diante. Meu programa imprime os arquivos e as pastas como um começo, mas eu preciso verificar cada um para se certificar de que é um diretório e, em seguida, insira-o. Alguém poderia fornecer alguma orientação sobre isso?

    
por Eric Anderson 28.09.2011 / 14:44

7 respostas

11

help test yields

test: test [expr]

[...]

-d FILE True if file is a directory.

[...]

Exit Status: Returns success if EXPR evaluates to true; fails if EXPR evaluates to false or an invalid argument is given.

test pode ser abreviado com [ , então você pode fazer

if [ -d "$file" ]; then
    # do stuff
fi
    
por 28.09.2011 / 14:49
2
test -d myFileOrFolder

mas o que você descreve parece com o comportamento de find .

    
por 28.09.2011 / 14:46
1

A partir de comentários inseridos em algumas das respostas, acredito que você queira executar algum script em cada diretório. Nesse caso, uma das maneiras possíveis é usar as opções find with exec da seguinte forma:

find ./ -type d -exec sh -c "cd {} && <your_script_with_absolute_path>" \;

Por exemplo, no diretório atual, há um script test.sh & você deseja executá-lo em cada subdiretório no diretório atual e, em seguida,

find ./ -type d -exec sh -c "cd {} && 'pwd'/test.sh" \;

Para o find command -type d pedirá para procurar todos os diretórios no caminho ./ passado como primeiro argumento. -exec executará o comando para cada tal achado, neste caso sh -c que está criando um shell & executando um comando com aspas, {} indica o argumento encontrado pelo comando find .
Espero que isso ajude!

    
por 28.09.2011 / 16:38
0

Use o operador -d para testar a existência de um diretório:

if [ -d "$DIR" ]; then
    ...
fi
    
por 28.09.2011 / 14:46
0

pseudocódigo:

[ -d your_filename ] && it's a folder ...
    
por 28.09.2011 / 14:46
0
find . -type d

isso encontra todos os subdiretórios

    
por 28.09.2011 / 14:48
0

Com base em alguns dos comentários, acredito que você não queira realmente imprimir os diretórios, mas sim processar todos os arquivos regulares em uma árvore de diretórios (incluindo todos os subdiretórios). Se for esse o caso, você pode querer dar uma olhada na opção exec para encontrar.

Na memória, você provavelmente quer algo parecido com isto (usando o comando cat para substituir seu script):

find . -type f -exec cat {} \;

Neste exemplo, todos os arquivos não-diretório na árvore inteira (recursivamente) serão processados por cat (impresso para saída padrão).

    
por 28.09.2011 / 15:09

Tags