J'ai deux dossiers avec des structures de sous-dossiers similaires, que je voudrais comparer. Par exemple:
A
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
et
B
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
Je voudrais répertorier tous les sous-dossiers A
dont le préfixe est un sous-dossier B
et répertorier également les sous-dossiers correspondants B
. La sortie attendue est
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
Une exigence secondaire: s'il y a plusieurs correspondances B
, cela devrait donner une erreur / un avertissement.
Ma solution :
cd A
for f in `ls -d */`;
do
cd B;
new_dirs=(`ls -1d $f*`);
cd -;
if [ ${#new_dirs[@]} -eq 0 ]
then
## DO_Nothing
continue;
elif [ ${#new_dirs[@]} -gt 1 ]
then
echo "Multiple matches to $f";
continue;
else
echo "Unique Match found to $f -- ${new_dirs[0]}";
continue;
fi;
done
Problème:
Pour ces valeurs de $f
, qui n'ont pas de sous-dossiers correspondants B
, la construction du tableau me donne une erreur. par exemple:
ls: impossible d'accéder à 'child-4 *': aucun fichier ou répertoire de ce type
Question
- Comment se débarrasser de ces erreurs?
- Existe-t-il un meilleur moyen d'atteindre le (s) but (s) que celui de mon code?
Merci d'avance!
diff -rq DIR1 DIR2
pour comparer non seulement la structure du répertoire, mais le contenu du fichier.Réponses:
La meilleure façon
Ne pas analyser
ls
; utilisez plutôt des globes. En fait, vous utilisez déjà des globes, il vous suffit de les envelopperls
, ce qui est inutile. Vous avez juste besoin de l'nullglob
allumer quand il n'y a pas de correspondance.Éviter également
cd
simplifie les choses.Production:
J'ai ajouté
B/child-3-something
pour tester l'exigence secondaire. Cela crée la structure de répertoires pour les tests:Soit dit en passant, ShellCheck est très utile pour trouver des problèmes dans les scripts shell.
la source
shellcheck
package serait la plus sécurisée]ShellCheck
. J'ai adoré la partie où non seulement vous indique vos erreurs, mais donne également des suggestions! @ Xen2050, de la part de téléchargement, je viens d' installer à l'shellcheck
aideapt
et réseau désactivé. Il semble fonctionner sans Internet .Appeler
ls
sur un dossier inexistant lance le message d'erreur que vous avez rencontré. Le plus simple est d'ignorer ce en remplaçant la ligne 5 dans votre script avec ceci:new_dirs=(`ls -1d $f* 2> /dev/null`);
.la source
t=(`echo ok; echo err 1>&2`)
$ t (ou${t[@]}
) ne contient que ok, l'erreur est vue dans le terminal mais pas enregistrée de toute façon. Ou y a-t-il quelque chose de drôle dans mon test?