Tôi muốn làm một cái gì đó lặp đi lặp lại trong một danh sách các tập tin. Các tập tin trong câu hỏi có khoảng trắng trong tên của chúng:
david@david: ls -l
total 32
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha
-rw-rw-r-- 1 david david 0 Mai 8 11:55 haha~
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (3rd copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (4th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (5th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (6th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (7th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (another copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (copy)
Bây giờ tôi muốn thống kê từng tệp này:
david@david: echo '
for file in $(ls)
do
stat $file
done' | bash
(Tôi sử dụng echo và pipe để viết các lệnh nhiều dòng.)
Khi tôi làm điều đó, nó hoạt động chính xác trên những tệp không có bất kỳ khoảng trắng nào trong tên của chúng. Nhưng những người khác ...
stat: cannot stat ‘(another’: No such file or directory
stat: cannot stat ‘copy)’: No such file or directory
Thay đổi $(ls)
để "$(ls)"
hoặc $file
để "$file"
không làm việc. Tôi có thể làm gì?
Biên tập:
echo '
for files in *
do
stat "$files"
done' | bash
lừa Vì tôi mới sử dụng bash, tôi muốn giữ mọi thứ đơn giản nhất có thể - vì vậy không có gì bằng cách cố gắng thoát khỏi không gian, hoặc sử dụng xargs
hoặc giải pháp với read -r
, mặc dù chúng giải quyết được vấn đề.
Như một số người đã hỏi: Có, sử dụng điều này thay vì stat *
là lạ. Nhưng tôi chỉ muốn tìm một cách chung để áp dụng cùng một lệnh trên một loạt các tên tệp trong bash, sử dụng vòng lặp for. Vì vậy, stat
có thể đứng cho gzip
, gpg
hoặc rm
.
stat *
vậy (;-)