Je veux exécuter une commande pour:
- Recherchez tous les répertoires nommés "
inc
" sous un dossier "X
". - Liste tous les sous-répertoires sous chaque "
X/.../inc/
". - Redirigez la sortie vers un fichier nommé "
list
"
J'ai essayé diverses combinaisons de la commande ci-dessous, sans succès:
$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression
Comment puis-je faire ceci?
linux
command-line
find
iammilind
la source
la source
Voici une doublure pratique:
Il s'exécute
find
sur chacun des premiersfind
résultats. L'exec
option peut également prendre une commande shell minimale, dans laquelle - comme je l'ai dit -{}
est remplacée par chaque répertoire du premierfind
.Le second
find
"listera tous les sous-répertoires" des premiers résultats, y compris leinc
répertoire. Si vous ne voulez pas cela lui-même dans la sortie, laissez le deuxième dossier de sortiefind
au moins de profondeur 1.Nous allons ensuite simplement rediriger la commande
stdout
verslist
.la source
find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
D'accord, j'ai trouvé la réponse pour simuler cette découverte imbriquée:
la source
find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list
(grep -z
délimite également le caractère nul, mais sa sortie semble également être séparée par des valeurs nulles, alors il faudrait alors le passer par exemplexargs -0L1 echo
pour l'obtenir ligne par ligne ). Dans ce cas, étant donné que vous enregistrez la liste dans un fichier avec chaque entrée séparée par un retour à la ligne, les retours à la ligne dans les noms de fichiers seront toujours représentés de manière ambiguë. Vous n'avez peut-être même pas besoin du fichier intermédiaire, selon ce que vous voulez faire avec la liste.Essaye ça:
la source
"\inc\"
:)-path
drapeau