J'essaie d'obtenir une liste des répertoires contenus dans un dossier spécifique.
Étant donné ces exemples de dossiers:
foo/bar/test
foo/bar/test/css
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
Je voudrais une commande qui retournera:
XYZ
ABC
DEF
GHI
Essentiellement, je recherche les dossiers qui se trouvent à l'intérieur de wp-content / plugins /
L'utilisation find
m'a rapproché le plus, mais je ne peux pas l'utiliser -maxdepth
, car le dossier est éloigné de l'endroit où je cherche.
L'exécution de ce qui suit retourne récursivement tous les répertoires enfants.
find -type d -path *wp-content/plugins/*
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI
?
. Pour bash, (comme indiqué dans la question), cela fonctionne .find
implémentations qui produisent un?
ou tout caractère de remplacement ou toute forme d'échappement pour les caractères non imprimables ne le font que lorsque la sortie va à un terminal, pas quand elle va à un canal comme ici.sed
/awk
que tous les fichiers sont sur une ligne. Maintenant, on peut faire valoir que l' obtention d' unABC?BCD
ouABC\nBCD
pour une sortie interactive / terminal serait plus utile que d' obtenir deuxABC
etBCD
lignes pour un répertoire appelé$'ABC\nBCD
. C'est au niveau de la présentation utilisateur, on pourrait aussi signaler que pour un fichier appelé$'AB\bC'
, lorsque la sortie va sur un terminal, on verraitAC
sans un tel?
remplacement ...Bash-iquement:
impressions:
ou
impressions:
la source
Vous pourriez avoir
find
recurse, en quelque sorte:la source
Pour Bash: Simple (fonctionne pour les fichiers / répertoires avec des espaces et des retours à la ligne ):
Imprimera:
Même s'il y a des fichiers créés.
la source
dotglob
option si cela n'est pas souhaité) et inclut des liens symboliques vers des répertoires en plus des répertoires (**
traverserait également les liens symboliques dans bash 4.2 et versions antérieures).find
n'exclut aucun fichier. globs exclut les fichiers de points, il convient de souligner la différence entre les deux.La
tree
commande est conçue exactement à cet effet. La profondeur peut être contrôlée avec le-L
drapeau. Voici un exemple sur un site Wordpress local que je maintiens:la source
S'appuyant sur la réponse de DopeGhoti, que diriez-vous de la boucle de correspondance:
La raison pour cela est que vous pouvez trouver cela déroutant / lourd avec plusieurs
-exec
, tout en évitant les problèmes avec les noms de fichiers particuliers contenant \ n '', etc. -print0 utilisera des séparateurs nuls entre les résultats.la source
S'appuyant sur ce que vous avez commencé:
egrep saisit * wp-content / plugins / * et tous les caractères jusqu'à la prochaine barre oblique / ou fin de ligne $ - qui inclut la partie que vous voulez.
sed , avec un délimiteur ~, sélectionne la portion que vous voulez en utilisant le premier jeu de parenthèses () et utilise \ 1 (ce que vous voulez) comme remplacement de tout
uniq filtre les résultats en double
la source