Podejdę do tego, aby najpierw pobrać UUID z pliku, a następnie użyć find
awk '{print $1}' listfile.txt | while read fileName;do find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;done
Dla gotowości
awk '{print $1}' listfile.txt | \
while read fileName;do \
find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;
done
Przykład z listą plików w /etc/poszukiwaniu nazw plików passwd, group, fstab i 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
Ponieważ wspomniałeś, że katalog jest płaski, możesz użyć -printf "%f\n"opcji, aby po prostu wydrukować samą nazwę pliku
Nie robi to, aby wyświetlić listę brakujących plików. findniewielką wadą jest to, że nie mówi ci, jeśli nie znajdzie pliku, tylko gdy coś pasuje. Można jednak sprawdzić dane wyjściowe - jeśli dane wyjściowe są puste, to brakuje nam pliku
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
Bardziej czytelny:
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
A oto jak działa jako mały skrypt:
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
Można użyć statjako alternatywy, ponieważ jest to płaski katalog, ale poniższy kod nie będzie działał rekurencyjnie dla podkatalogów, jeśli kiedykolwiek zdecydujesz się je dodać:
$ 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
Jeśli weźmiemy ten statpomysł i uruchomimy go, możemy użyć kodu wyjścia stat jako wskazania, czy plik istnieje, czy nie. Skutecznie chcemy to zrobić:
$ 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
Przykładowy przebieg:
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