2012-11-23 3 views

Répondre

123

POSIX 7 solution:

find . ! -path . -type d 

Pour ce cas particulier (.), Golfs mieux que la solution mindepth (24 vs 26 caractères), bien que ce soit probablement un peu plus difficile à taper à cause du !.

Pour exclure d'autres répertoires, ce golf de volonté moins bien et nécessite une variable pour seicheresse:

D="long_name" 
find "$D" ! -path "$D" -type d 

Mon arbre de décision entre ! et -mindepth:

    scénario
  • ? Utilisez ! pour la portabilité.
  • session interactive sur GNU?
    • excluez .? Jetez une pièce de monnaie.
    • exclure long_name? Utilisez -mindepth.
+0

si vous devez exclure plusieurs chemins, faites juste 'find/path /! -path "/ chemin/premier"! -path "/ path/second" 'est ce seul chemin? –

+1

@VincentDeSmet Voulez-vous exclure uniquement ces chemins, ou ne pas les recréer? Si seulement les chemins, vous pouvez utiliser 'find /! -regex '/ \ (a \ | b \) /.*' 'ou plus simplement, passe par grep. Pour ne pas recurse, ce qui précède serait très inefficace et vous devriez utiliser '-prune': http://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh –

+0

my Le problème était le suivant: je voulais supprimer récursivement tout ce qui se trouvait dans un répertoire sauf 1 sous-répertoire. J'utilisais 'find' avec' grep' pour exclure le répertoire mais le répertoire parent était toujours là, provoquant la suppression de tout. –

125

Non seulement la profondeur de récursivité de find peut être contrôlée par le paramètre -maxdepth, mais la profondeur peut également être limitée de "haut" à l'aide du paramètre -mindepth correspondant. Donc, ce que l'on a réellement besoin est:

find . -mindepth 1 -type d 
+3

fonctionne sur GNU trouver, mais est malheureusement une extension gnu à la [trouver Posix 7] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html#tag_20_47) , et même le LSB utilise les utilitaires de shell POSIX (pas ceux étendus GNU) –

+3

Cela a fonctionné pour moi. À savoir: 'trouver. -mindepth 1 -maxdepth 1 -type d ... ' – racl101

+0

Bonne observation et bonne solution, bravo! – PCatinean

16

J'utilise find ./* <...> quand je ne me dérange pas ignorant de premier niveau dotfiles (le * glob ne correspond pas à ceux-ci par défaut dans bash - voir l'option 'dotglob' dans le shopt builtin: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html) .

 
eclipse tmp # find . 
. 
./screen 
./screen/.testfile2 
./.X11-unix 
./.ICE-unix 
./tmux-0 
./tmux-0/default 
 
eclipse tmp # find ./* 
./screen 
./screen/.testfile2 
./tmux-0 
./tmux-0/default 
+0

FYI. n'utilisez pas cette astuce avec '-exec'option. Par exemple, si vous essayez 'find dir/* -type d -exec rmdir {} \;', vous verrez des erreurs. – plhn

+0

Vous vous êtes trompé, ou peut-être déconseillé. Cette commande fonctionnera bien. Si vous voyez des erreurs, elles proviendront de 'rmdir' et vous indiqueront probablement que les répertoires ne sont pas vides puisque' find' fera une recherche en profondeur dans les répertoires, montrant les parents avant leurs enfants. –

+1

Vous avez raison, Milos. – plhn

Questions connexes