J'ai besoin que mon script fasse quelque chose pour chaque fichier du répertoire courant à l'exclusion de tout sous-répertoire.
Par exemple, dans le chemin actuel, il y a 5 fichiers, mais 1 d'entre eux est un dossier (un sous-répertoire). Mon script doit activer une commande donnée comme arguments lors de l'exécution dudit script. C'est-à-dire que "bash script wc -w" devrait donner le nombre de mots de chaque fichier dans le répertoire en cours, mais aucun des dossiers, afin que la sortie ne contienne jamais aucune des lignes "/ sub / dir: Is a directory".
Mon script actuel:
#!/bin/bash
dir=`pwd`
for file in $dir/*
do
$* $file
done
J'ai juste besoin d'exclure les répertoires de la boucle, mais je ne sais pas comment.
if [ -f "$file" ]; then ...
. Pas un répertoire ne retournerait non seulement des fichiers normaux mais aussi des sockets et des liens symboliques.! -d
déjà.Voici une alternative à l'utilisation d'une boucle for si ce que vous devez faire est simple (et n'implique pas de définir des variables dans le shell principal & c).
Vous pouvez utiliser
find
avec-exec
et utiliser-maxdepth 1
pour éviter de revenir dans le sous-répertoire.Le
[ -n "$1" ]
est là pour éviter d'exécuter tous les fichiers du répertoire lorsque le script ne reçoit aucun argument.la source
Dans zsh, vous pouvez utiliser des qualificatifs glob pour restreindre les correspondances génériques par type de fichier. Par exemple, l'ajout
(.)
après le modèle le restreint aux fichiers normaux.Pour gérer les noms de fichiers commençant par
-
ou.
, utilisezwc -c -- *(.N)
ouwc -c ./*(.N)
. Si vous souhaitez également inclure des liens symboliques vers des fichiers standard, faites-le*(-.)
.Les autres shells courants n'ont pas une telle fonctionnalité, vous devez donc utiliser un mécanisme différent pour filtrer par fichier, comme tester les types de fichiers dans une boucle ou
find
.la source
Bash for loop excluant les sous-répertoires ('/') et les liens (@):
la source