J'ai un dossier avec des répertoires et des fichiers (certains sont cachés, commençant par un point).
for d in *; do
echo $d
done
passera en boucle dans tous les fichiers, mais je veux uniquement en boucle dans les répertoires. Comment je fais ça?
[[ -L $d ]]
si $ d est un lien symbolique.set -P
n'affecte que les commandes qui changent de répertoire. sprunge.us/TNac[[ -L "$f" ]]
n'exclura pas les liens symboliques dans ce cas avec*/
, vous devez[[ -L "${f%/}" ]]
Vous pouvez tester avec
-d
:C'est l'un des opérateurs de test de fichier .
la source
if [[ -d "$f" && ! -L "$f" ]]
exclura les liens symboliquesif [[ "$f" = "*" ]]; then continue; fi
Attention, la solution de choroba, bien qu'élégante, peut provoquer un comportement inattendu si aucun répertoire n'est disponible dans le répertoire actuel. Dans cet état, plutôt que de sauter la
for
boucle, bash exécutera la boucle exactement une fois oùd
est égal à*/
:Je recommande d'utiliser les éléments suivants pour vous protéger contre ce cas:
Ce code parcourt tous les fichiers du répertoire en cours, vérifie s’il
f
s’agit d’un répertoire, puis indiquef
si la condition renvoie true. Sif
est égal à*/
,echo $f
ne sera pas exécuté.la source
shopt -s nullglob
.Si vous devez sélectionner des fichiers plus spécifiques que seuls les répertoires utilisent
find
, transmettez-les àwhile read
:Utilisez
shopt -u dotglob
pour exclure les répertoires cachés (ousetopt dotglob
/unsetopt dotglob
dans zsh).IFS=
pour éviter de diviser les noms de fichiers contenant l’un des$IFS
, par exemple:'a b'
voir la réponse AsymLabs ci-dessous pour plus d'
find
optionsedit:
au cas où vous auriez besoin de créer une valeur de sortie à partir de la boucle while, vous pouvez contourner le sous-shell supplémentaire par cette astuce:
la source
Vous pouvez utiliser pure bash pour cela, mais il vaut mieux utiliser find:
(trouver en outre comprendra des répertoires cachés)
la source
shopt -s dotglob
pourbash
inclure des répertoires cachés. Le vôtre comprendra également.
. Notez également que ce-maxdepth
n'est pas une option standard (-prune
est).dotglob
option est intéressante maisdotglob
ne concerne que l'utilisation de*
.find .
inclura toujours les répertoires cachés (ainsi que le répertoire courant)Ceci est fait pour trouver les répertoires visibles et cachés dans le répertoire de travail actuel, en excluant le répertoire racine:
pour simplement parcourir les répertoires:
inclure des liens symboliques dans le résultat:
faire quelque chose dans chaque répertoire (à l'exclusion des liens symboliques):
pour exclure les répertoires cachés:
pour exécuter plusieurs commandes sur les valeurs retournées (un exemple très artificiel):
au lieu de 'sh -c', vous pouvez également utiliser 'bash -c', etc.
la source
... -print0 | xargs -0 ...
si vous ne connaissez pas les noms exacts.find * | while read file; do ...
Vous pouvez parcourir tous les répertoires, y compris les répertoires cachés (commençant par un point) sur une ligne et plusieurs commandes avec:
Si vous souhaitez exclure les liens symboliques:
Remarque: l' utilisation de la liste
*/ .*/
fonctionne sous bash, mais affiche également les dossiers.
et..
ne s'affiche pas dans zsh, mais génère une erreur s'il n'y a pas de fichier caché dans le dossier.Une version plus propre qui inclura les répertoires cachés et exclura ../ sera avec l'option dotglob:
(ou
setopt dotglob
en zsh)vous pouvez désinstaller DOTGLOB avec
la source
Cela inclura le chemin complet dans chaque répertoire de la liste:
la source
Utilisez
find
with-exec
pour parcourir les répertoires et appeler une fonction dans l'option exec:Utiliser
shopt -s dotglob
oushopt -u dotglob
pour inclure / exclure des répertoires cachésla source
Ceci liste tous les répertoires avec le nombre de sous-répertoires dans un chemin donné:
la source
la source
This
is
one
directory
with
spaces
in
the
name
- mais est analysé comme multiple.ou:
Vous pouvez le définir comme un alias
la source
ls
réponse à cette base, qui répertorie les répertoires.ls
: mywiki.wooledge.org/ParsingLs