Với GNU awk
:
watch -x gawk '
FNR == 17 {nextfile}
ENDFILE {if (FNR) printf "%15s[%02d] %s\n", FILENAME, FNR, $0}' ./*
Cung cấp một đầu ra như:
./file1[17] line17
./short-file2[05] line 5 is the last
Lưu ý rằng toàn ./*
cầu chỉ được mở rộng một lần tại thời điểm watch
được gọi.
Your watch head -n 17 *
là một lỗ hổng tiêm lệnh tùy ý vì sự mở rộng của nó *
thực sự được hiểu là mã shell bởi shell mà watch
gọi để giải thích sự kết hợp các đối số của nó với khoảng trắng.
Nếu có một tệp được gọi $(reboot)
trong thư mục hiện tại, nó sẽ khởi động lại.
Với -x
, chúng tôi đang nói watch
bỏ qua shell và thực hiện lệnh trực tiếp. Ngoài ra, bạn có thể làm:
watch 'exec gawk '\''
FNR == 17 {nextfile}
ENDFILE {if (FNR) printf "%15s[%02d] %s\n", FILENAME, FNR, $0}'\'' ./*'
Để watch
chạy một shell sẽ mở rộng toàn ./*
cầu đó ở mỗi lần lặp. watch foo bar
có hiệu lực tương tự như watch -x sh -c 'foo bar'
. Khi sử dụng watch -x
, bạn có thể chỉ định shell nào bạn muốn và ví dụ, chọn shell mạnh hơn như thế zsh
có thể thực hiện đệ quy đệ quy và giới hạn đối với các tệp thông thường:
watch -x zsh -c 'awk '\''...'\'' ./**/*(.)'
Không có gawk
, bạn vẫn có thể làm một cái gì đó như:
watch '
for file in ./*; do
[ -s "$file" ] || continue
printf "%s: " "$file"
head -n 17 < "$file" | tail -n 1
done'
Đưa ra một thông số như:
./file1: line17
./short-file2: line 5 is the last
Nhưng điều đó sẽ kém hiệu quả hơn rất nhiều vì nó ngụ ý chạy một số lệnh cho mỗi tệp.
find . -exec
hoặc sth như thế này: D