Je veux que mon script shell visite tous les sous-répertoires d'un répertoire principal. Faites quelque chose dans les répertoires, envoyez la sortie vers un fichier spool et passez au répertoire suivant. Considérez Dir principal = / tmp Sous Dir = ABCD (quatre sous-répertoires)
bash
shell-script
Ashish
la source
la source
Réponses:
Utilisez une
for
boucle:Il recherche uniquement les sous-répertoires du répertoire
/path/to/dir
. Notez que l'exemple simple ci-dessus échouera si les noms de répertoire contiennent des espaces ou des caractères spéciaux. Une approche plus sûre consiste à:Ou en clair
bash
:(notez que contrairement à
find
cela, on considère également les liens symboliques vers les répertoires et exclut ceux cachés)la source
find
comme ça.date +"%m%d20%Y"
| xargs echo echo echo $ ddate +"%m%d20%Y"
| xargs echo echo $ d Le résultat attendu est ls -ltr de tous les sous-répertoires . La boucle ci-dessus ne fonctionne pasJe suis un
bash
débutant complet , mais un vétéran UN * X. Bien que cela puisse sans doute être fait dans les scripts shell Bash, dans le passé, nous avions l'habitudefind [-maxdepth <levels>] <start-dir> -exec <command> ;
de le faire. Vous pourriez en faire unman find
et jouer, peut-être jusqu'à ce que quelqu'un vous dise comment le fairebash
!la source
find
commande externe .$(find...)
chose est une mauvaise pratique .On dirait que vous voulez les noms de fichiers sous chacun des sous-répertoires; le
ls -l | awk
n'est pas assez robuste, et si ces noms de fichiers comprennent des espaces et / ou des retours à la ligne? Ce qui suitfind
fonctionnerait même pourfind
les personnes qui n'ont pas le choix-maxdepth
:la source
J'ai la solution. La commande find ci-dessous répond à mes besoins.
la source
Il est également possible d'utiliser ls, grep et tr
du / sed peut également être utilisé comme sélecteur si votre ls n'a pas les options ci-dessus
Il peut être important de noter que ces exemples renvoient des répertoires cachés et excluent les répertoires parent et actuels
la source
ls
écrit un fichier par ligne (ce que l'-1
option spécifie) par défaut lorsque la sortie standard est un tube (donc c'est superflu dans vos réponses). (2) L'analyse de la sortie dels
est une mauvaise idée - voir ceci et cela . Votre première réponse échouera si les répertoires ont des espaces (ou des retours à la ligne) dans leurs noms, et tous échoueront s'ils ont des retours à la ligne dans leurs noms. (3) Vous devez toujours citer les variables shell (par exemple,"$dir"
) sauf si vous avez une bonne raison de ne pas le faire, et vous êtes sûr de savoir ce que vous faites.