Die Art und Weise, wie ich es angehen würde, besteht darin, zuerst UUIDs aus der Datei zu holen und dann zu verwenden find
awk '{print $1}' listfile.txt | while read fileName;do find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;done
Zur besseren Lesbarkeit
awk '{print $1}' listfile.txt | \
while read fileName;do \
find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;
done
Beispiel mit einer Liste von Dateien in /etc/
, die nach den Dateinamen passwd, group, fstab und THISDOESNTEXIST suchen.
$ 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
Da Sie das Verzeichnis ist flach erwähnt haben, könnten Sie die verwenden -printf "%f\n"
Option , um Dateinamen selbst nur drucken
Dies führt nicht dazu, dass fehlende Dateien aufgelistet werden. find
Der kleine Nachteil ist, dass es Ihnen nicht sagt, ob es keine Datei findet, sondern nur, wenn es mit etwas übereinstimmt. Was man jedoch tun könnte, ist die Ausgabe zu überprüfen - wenn die Ausgabe leer ist, fehlt eine Datei
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
Besser lesbar:
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
Und so funktioniert es als kleines Skript:
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
Man könnte es stat
als Alternative verwenden, da es sich um ein flaches Verzeichnis handelt, aber der folgende Code funktioniert nicht rekursiv für Unterverzeichnisse, wenn Sie sich jemals dazu entschließen, diese hinzuzufügen:
$ 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
Wenn wir die stat
Idee aufgreifen und damit arbeiten, können wir den Exit-Code von stat als Hinweis darauf verwenden, ob eine Datei vorhanden ist oder nicht. Tatsächlich wollen wir dies tun:
$ 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
Probelauf:
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