La façon dont je l'aborderais est d'obtenir d'abord les uuids du fichier, puis d'utiliser find
awk '{print $1}' listfile.txt | while read fileName;do find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;done
Pour la lisibilité,
awk '{print $1}' listfile.txt | \
while read fileName;do \
find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;
done
Exemple avec une liste de fichiers dans /etc/
, recherchant les noms de fichiers passwd, group, fstab et THISDOESNTEXIST.
$ awk '{print $1}' listfile.txt | while read fileName;do find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null; done
/etc/pam.d/passwd FOUND
/etc/cron.daily/passwd FOUND
/etc/passwd FOUND
/etc/group FOUND
/etc/iproute2/group FOUND
/etc/fstab FOUND
Puisque vous avez mentionné que le répertoire est plat, vous pouvez utiliser l' -printf "%f\n"
option pour simplement imprimer le nom de fichier lui-même
Ce que cela ne fait pas, c'est de répertorier les fichiers manquants. find
Le petit inconvénient est qu'il ne vous dit pas s'il ne trouve pas de fichier, seulement lorsqu'il correspond à quelque chose. Ce que l'on pourrait faire, cependant, est de vérifier la sortie - si la sortie est vide, alors nous avons un fichier manquant
awk '{print $1}' listfile.txt | while read fileName;do RESULT="$(find /etc -name "$fileName*" -printf "%p\n" 2> /dev/null )"; [ -z "$RESULT" ] && echo "$fileName not found" || echo "$fileName found" ;done
Plus lisible:
awk '{print $1}' listfile.txt | \
while read fileName;do \
RESULT="$(find /etc -name "$fileName*" -printf "%p\n" 2> /dev/null )"; \
[ -z "$RESULT" ] && echo "$fileName not found" || \
echo "$fileName found"
done
Et voici comment il fonctionne comme un petit script:
skolodya@ubuntu:$ ./listfiles.sh
passwd found
group found
fstab found
THISDONTEXIST not found
skolodya@ubuntu:$ cat listfiles.sh
#!/bin/bash
awk '{print $1}' listfile.txt | \
while read fileName;do \
RESULT="$(find /etc -name "$fileName*" -printf "%p\n" 2> /dev/null )"; \
[ -z "$RESULT" ] && echo "$fileName not found" || \
echo "$fileName found"
done
On pourrait utiliser stat
comme alternative, car c'est un répertoire plat, mais le code ci-dessous ne fonctionnera pas récursivement pour les sous-répertoires si vous décidez de les ajouter:
$ awk '{print $1}' listfile.txt | while read fileName;do stat /etc/"$fileName"* 1> /dev/null ;done
stat: cannot stat ‘/etc/THISDONTEXIST*’: No such file or directory
Si nous prenons l' stat
idée et l'exécutons, nous pourrions utiliser le code de sortie de stat pour indiquer si un fichier existe ou non. Effectivement, nous voulons faire ceci:
$ awk '{print $1}' listfile.txt | while read fileName;do if stat /etc/"$fileName"* &> /dev/null;then echo "$fileName found"; else echo "$fileName NOT found"; fi ;done
Exemple d'exécution:
skolodya@ubuntu:$ awk '{print $1}' listfile.txt | \
> while read FILE; do
> if stat /etc/"$FILE" &> /dev/null ;then
> echo "$FILE found"
> else echo "$FILE NOT found"
> fi
> done
passwd found
group found
fstab found
THISDONTEXIST NOT found