Unix: verifique si el archivo es una carpeta

3

Así que necesito recorrer un árbol de directorios, actualmente puedo imprimir todos los archivos en un directorio, pero una vez hecho esto, debo poder ir a las subcarpetas del directorio de inicio, etc. Mi programa imprime los archivos y las carpetas como inicio, pero necesito verificar cada uno para asegurarme de que sea un directorio y luego ingresarlo. ¿Podría alguien proporcionar alguna orientación sobre esto?

Eric Anderson
fuente

Respuestas:

13

help test rendimientos

prueba: prueba [expr]

[...]

-d ARCHIVO Verdadero si el archivo es un directorio.

[...]

Estado de salida: Devuelve el éxito si EXPR se evalúa como verdadero; falla si EXPR se evalúa como falso o se da un argumento no válido.

testse puede abreviar con [, para que pueda hacer

if [ -d "$file" ]; then
    # do stuff
fi
glglgl
fuente
2
test -d myFileOrFolder

pero lo que describe se parece al comportamiento de find.

Mouviciel
fuente
1

Supongo que de los comentarios ingresados ​​a algunas de las respuestas, desea ejecutar algún script en cada uno de los directorios. En ese caso, una de las posibles maneras de hacerlo es utilizar findcon execopciones de la siguiente manera:

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

Por ejemplo, en el directorio actual hay un script test.shy desea ejecutarlo en cada subdirectorio en el directorio actual y luego

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

Al findcomando se -type dle pedirá que busque todos los directorios en la ruta ./pasada como primer argumento. -execejecutará el comando para cada uno de estos hallazgos, en este caso, sh -cque está creando un shell y ejecutando un comando con comillas, {}indica el argumento encontrado por el findcomando.
¡Espero que esto ayude!

otro.anon.coward
fuente
0

Use el -doperador para probar la existencia de un directorio:

if [ -d "$DIR" ]; then
    ...
fi

fuente
Ok, eso tiene sentido, entonces, ¿cómo ingresaría a ese directorio y volvería a ejecutar el script?
0

Pseudocódigo:

[ -d your_filename ] && it's a folder ...
Dimitre Radoulov
fuente
entonces, ¿cómo ingresaría al nuevo directorio y luego llamaría a mi script nuevamente?
0
find . -type d

esto encuentra todos los subdirectorios

Foo Bah
fuente
entonces, ¿cómo ingresaría al nuevo directorio y luego llamaría a mi script nuevamente?
hay una -execdiropción y algunas otras, dependiendo de su versión de find. También podría canalizar esto a un bucle while que explícitamente visitó cada directorio.
Foo Bah
0

Según algunos de los comentarios, supongo que en realidad no desea imprimir los directorios, sino que procesa todos los archivos normales en un árbol de directorios (incluidos todos los subdirectorios). Si ese es el caso, es posible que desee echar un vistazo a la execopción para encontrar.

De memoria, probablemente quieras algo como esto (usando el catcomando para reemplazar tu script):

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

En este ejemplo, todos los archivos que no son de directorio en todo el árbol (recursivamente) serán procesados ​​por cat(impresos en salida estándar).


fuente