Cách tôi tiếp cận là lấy uuids từ tệp trước, sau đó sử dụng find
awk '{print $1}' listfile.txt | while read fileName;do find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;done
Để sẵn sàng,
awk '{print $1}' listfile.txt | \
while read fileName;do \
find /etc -name "$fileName*" -printf "%p FOUND\n" 2> /dev/null;
done
Ví dụ với một danh sách các tệp trong /etc/
, tìm kiếm tên tệp passwd, nhóm, fstab và 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
Vì bạn đã đề cập đến thư mục phẳng, bạn có thể sử dụng -printf "%f\n"
tùy chọn để chỉ in tên tệp
Điều này không làm là liệt kê các tập tin bị thiếu. find
Nhược điểm nhỏ là nó không cho bạn biết nếu nó không tìm thấy tệp, chỉ khi nó khớp với thứ gì đó. Tuy nhiên, những gì người ta có thể làm là kiểm tra đầu ra - nếu đầu ra trống, thì chúng ta có một tệp bị thiếu
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
Dễ đọc hơn:
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
Và đây là cách nó thực hiện như một kịch bản nhỏ:
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
Người ta có thể sử dụng stat
thay thế, vì đó là một thư mục phẳng, nhưng mã dưới đây sẽ không hoạt động đệ quy cho các thư mục con nếu bạn quyết định thêm chúng:
$ 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
Nếu chúng ta lấy stat
ý tưởng và chạy với nó, chúng ta có thể sử dụng mã thoát của stat làm chỉ dẫn cho việc một tệp có tồn tại hay không. Hiệu quả, chúng tôi muốn làm điều này:
$ 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
Chạy mẫu:
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