"Loại tệp" trên hệ thống Unix là những thứ như tệp thông thường, thư mục, đường ống có tên, tệp đặc biệt ký tự, liên kết tượng trưng, v.v ... Đây là loại tệp find
có thể lọc với -type
tùy chọn của nó .
Các find
tiện ích có thể không phải do bản thân phân biệt giữa một "shell script", "JPEG tập tin hình ảnh" hoặc bất kỳ khác loại tập tin thường xuyên . Tuy nhiên, các loại dữ liệu này có thể được phân biệt bởi file
tiện ích, xem xét các chữ ký cụ thể trong chính các tệp để xác định loại của chúng.
Một cách phổ biến để gắn nhãn các loại tệp dữ liệu khác nhau là theo loại MIME của chúng và file
có thể xác định loại MIME của tệp.
Sử dụng file
với find
để phát hiện các kiểu MIME của tập tin thông thường, và việc sử dụng đó để chỉ tìm thấy kịch bản shell:
find . -type f -exec sh -c '
case $( file -bi "$1" ) in
*/x-shellscript*) exit 0
esac
exit 1' sh {} ';' -print
hoặc, sử dụng bash
,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
Thêm vào -name sunrise
trước -exec
nếu bạn muốn chỉ phát hiện các tập lệnh có tên đó.
Các find
lệnh trên sẽ tìm thấy tất cả các file thường xuyên trong hoặc dưới thư mục hiện hành, và cho mỗi cuộc gọi tập tin như vậy một đoạn ngắn shell script in-line. Kịch bản lệnh này chạy file -bi
trên tệp tìm thấy và thoát với trạng thái thoát bằng 0 nếu đầu ra của lệnh đó chứa chuỗi /x-shellscript
. Nếu đầu ra không chứa chuỗi đó, nó sẽ thoát với trạng thái thoát khác không, điều này sẽ find
tiếp tục ngay lập tức với tệp tiếp theo. Nếu tệp được tìm thấy là tập lệnh shell, find
lệnh sẽ tiến hành xuất tên đường dẫn của tệp ( -print
ở cuối, cũng có thể được thay thế bằng một số hành động khác).
Các file -bi
lệnh sẽ ra kiểu MIME của tập tin. Đối với tập lệnh shell trên Linux (và hầu hết các hệ thống khác), đây sẽ là một cái gì đó như
text/x-shellscript; charset=us-ascii
trong khi trên các hệ thống có biến thể cũ hơn một chút của file
tiện ích, nó có thể là
application/x-shellscript
Các bit phổ biến là /x-shellscript
chuỗi con.
Lưu ý rằng trên macOS, bạn sẽ phải sử dụng file -bI
thay file -bi
vì lý do ( -i
tùy chọn thực hiện một số thứ khá khác nhau). Đầu ra trên macOS tương tự như hệ thống Linux.
Bạn có muốn thực hiện một số hành động tùy chỉnh trên mỗi tập lệnh shell được tìm thấy không, bạn có thể làm điều đó với một tập lệnh khác -exec
thay cho -print
các find
lệnh ở trên, nhưng cũng có thể thực hiện được
find . -type f -exec sh -c '
for pathname do
case $( file -bi "$pathname" ) in
*/x-shellscript*) ;;
*) continue
esac
# some code here that acts on "$pathname"
done' sh {} +
hoặc, với bash
,
find . -type f -exec bash -c '
for pathname do
[[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue
# some code here that acts on "$pathname"
done' bash {} +
Liên quan:
--filetype
tùy chọn cho lệnh find hoặc bất cứ điều gì khác sẽ cho bạn biết loại tệp. Điều duy nhất bạn có thể làm là sử dụng--exec file {} \;
và sau đó chuyển nó vàogrep Bourne
nếu bạn đang tìm kiếm các tập lệnh bash hoặcgrep Perl
nếu bạn đang tìm kiếm các tập lệnh Perl hoặc một cái gì đó dọc theo các dòng đó.