Trouver des directorys qui ne contiennent pas de sous-directorys

J'écris le script est ksh. Besoin de find tous les noms de directorys directement sous le directory courant qui contiennent uniquement des files, pas des sous-directorys.

Je sais que je pourrais utiliser ls -alR et parsingr récursivement la sortie de la première lettre dans le premier champ ( d pour un directory). Je pense que awk est la meilleure façon d'parsingr et de find, mais je suis un peu confus avec elle. S'il vous plaît aider !!

Par exemple, une sortie ls -al simple dans le directory courant:

  drwxr-xr-x 22 af staff 748 18 Mar 22:21 . drwxr-xr-x 5 root admin 170 17 Mar 18:03 .. -rw------- 1 af staff 3 17 Mar 16:37 .CFUserTextEncoding drwxr-xr-x 5 af staff 170 17 Mar 17:12 Public drwxr-xr-x 9 af staff 306 18 Mar 17:40 Sites -rw------- 1 af staff 3 17 Mar 16:37 textd … 

Il y a 2 directorys dans cette sortie: Public et Sites . Le directory Public ne contient pas de sous-directorys, mais les Sites font. Il y a 3 sous-directorys dans Sites . Je n'ai donc besoin d'écho que les directorys qui ne contiennent pas de directorys. Dans mon cas, ce n'est que des Sites .

Vous n'avez pas besoin d'utiliser awk du tout. Utilisez les tests ksh fournis par ksh , quelque chose comme ceci:

 #!/bin/ksh for NAME in * do FOUND=no if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]] then for SUBNAME in $NAME/* do if [[ -d $SUBNAME ]] then FOUND=yes break fi done if [[ $FOUND == no ]] then echo Found only files in $NAME fi fi done 

Ce petit script regarde tous les directorys du directory courant et vous indique s'ils ne contiennent que des files, pas de sous-directorys.

Si vous pouvez utiliser find et si vous travaillez sur un "système de files Unix normal" (c'est-à-dire comme défini dans find (1) sous la description de l'option -noleaf ), la command suivante peut être utilisée:

 find . -type d -links 2 

Chaque directory a au less 2 noms (liens physiques):. et son nom. Ses sous-directorys, le cas échéant, auront un pointeur vers le directory parent, ainsi un directory avec N sous-directorys aura un nombre de liens dur égal à N + 2. Ainsi, la search des directorys dont le nombre de liens matériels est égal à 2 permet de searchr des directorys avec des sous-directorys N = 0.

Donc, si vous pouvez utiliser find , c'est sans doute la méthode la plus rapide et évidemment supérieure aux loops en-shell sur le contenu du directory stat() de chacun de ses membres.

*/ correspond aux sous-directorys du directory courant. Cela inclut les liens symboliques vers des directorys, que vous pouvez ou non souhaiter.

En ksh93, l'ajout de ~(N) au début du pattern le fait élargir à la list vide s'il n'y a pas de correspondance. Sans cela, le model rest inchangé s'il n'y a pas de correspondance.

La fonction ksh93 suivante répertorie les sous-directorys des directorys actuels qui ne contiennent aucun sous-directory ou lien vers un directory.

 list_leaf_directories () { local FIGNORE='.?(.)' # don't ignore dot files local d for d in */; do [[ -L $d ]] || continue; # skip symbolic links set -- ~(N)"$d"/*/ if ((!#)); then echo "$d"; fi done done 

si je ne vous comprends pas mal, vous ne voulez find que des files dans le directory et non les sous-directorys. Si c'est votre intention, voici la solution

 find . -type f 

si vous voulez find des files autres que des files ordinaires (comme les files de périphériques de bloc, les files de périphériques de caractères, etc.), consultez la page de manuel de la command find et searchz le mot key type sur cette page. Vous verrez différents types de files, y compris les files et directorys réguliers, etc.

J'espère que c'est ce que vous cherchez