Quiero que mi script de shell visite todos los subdirectorios en un directorio principal. Haga algo en los directorios, envíe la salida a un archivo de cola y pase al siguiente directorio. Considere Main Dir = / tmp Sub Dir = ABCD (Cuatro subdirectorios)
bash
shell-script
Ashish
fuente
fuente

Respuestas:
Usa un
forbucle:Busca solo los subdirectorios del directorio
/path/to/dir. Tenga en cuenta que el ejemplo simple anterior fallará si los nombres de directorio contienen espacios en blanco o caracteres especiales. Un enfoque más seguro es:O en claro
bash:(tenga en cuenta que, al contrario,
findtambién se consideran enlaces simbólicos a directorios y se excluyen los ocultos)fuente
findese tipo.date +"%m%d20%Y"| xargs echo echo $ ddate +"%m%d20%Y"| xargs echo echo $ d El resultado esperado es ls -ltr de todo el subdirectorio . El bucle anterior no funcionaSoy un
bashnovato completo , pero veterano de UN * X. Aunque indudablemente esto se puede hacer en el script de shell Bash, en los viejos tiempos solíamosfind [-maxdepth <levels>] <start-dir> -exec <command> ;lograr esto. ¡Podrías hacerman findy jugar, tal vez hasta que alguien te diga cómo hacerlobash!fuente
findde comando.$(find...)cosa es mala práctica .Parece que quiere los nombres de archivo debajo de cada subdirectorio; el
ls -l | awkno es lo suficientemente robusta, por lo que si los nombres de archivo contienen espacios en blanco y / o saltos de línea? Lo siguientefindfuncionaría incluso parafindaquellos que no tienen la posibilidad de hacerlo-maxdepth:fuente
Tengo la solución El siguiente comando de búsqueda cumple mis requisitos.
fuente
También es posible usar ls, grep y tr
du / sed también se puede usar como selector si su ls carece de las opciones anteriores
Puede ser importante tener en cuenta que estos ejemplos devuelven directorios ocultos y excluyen directorios principales y actuales
fuente
lsescribe un archivo por línea (lo que-1especifica la opción) de forma predeterminada cuando la salida estándar es una tubería (por lo que es superfluo en sus respuestas). (2) Analizar la salida delses una mala idea: vea esto y esto . Su primera respuesta fallará si los directorios tienen espacios (o nuevas líneas) en sus nombres, y todos fallarán si tienen nuevas líneas en sus nombres. (3) Siempre debe citar las variables de shell (por ejemplo,"$dir") a menos que tenga una buena razón para no hacerlo y esté seguro de saber lo que está haciendo.