Il modo in cui mi avvicinerei è quello di ottenere prima gli uuidi dal file, quindi utilizzare find
awk '{print $1}' listfile.txt | while read fileName;do find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;done
Per leggibilità,
awk '{print $1}' listfile.txt | \
while read fileName;do \
find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;
done
Esempio con un elenco di file in /etc/
, cercando i nomi dei file passwd, group, fstab e 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
Dal momento che hai menzionato la directory è piatta, è possibile utilizzare l' -printf "%f\n"
opzione per stampare solo il nome file stesso
Ciò che non fa è elencare i file mancanti. find
Il piccolo svantaggio è che non ti dice se non trova un file, solo quando corrisponde a qualcosa. Ciò che si potrebbe fare, tuttavia, è controllare l'output: se l'output è vuoto, allora manca un file
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
Più leggibile:
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
Ed ecco come si comporta come un piccolo 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
Si potrebbe usare stat
come alternativa, dal momento che è una directory piatta, ma il codice seguente non funzionerà in modo ricorsivo per le sottodirectory se si decide di aggiungere quelle:
$ 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
Se prendiamo l' stat
idea e la eseguiamo, potremmo usare il codice di uscita di stat come indicazione dell'esistenza o meno di un file. In effetti, vogliamo fare questo:
$ 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
Esecuzione di esempio:
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