Nó không an toàn để phân tích ls
hoặc đường ống find
[ 1 , 2 ]
Sẽ không an toàn khi phân tích (và chuyển đổi) đầu ra của ls
hoặc find
, chủ yếu bởi vì có thể tìm thấy trong các tên tệp không phải là ký tự thông thường như dòng mới , tab ... Ở đây, chu trình shell thuần sẽ hoạt động [ cuonglm ] .
Ngay cả find
lệnh không được đặt với tùy chọn-exec
sẽ hoạt động:
find ./*.png -exec basename {} .png \;
Cập nhật / Ghi chú : Bạn có thể sử dụng find .
để tìm kiếm ngay cả các tệp bị ẩn hoặc find ./*.png
chỉ nhận những tệp không bị ẩn. Với find *.png -exec ...
bạn có thể có vấn đề trong trường hợp nó xuất hiện một tệp có tên .png
vì find sẽ lấy nó làm tùy chọn. Bạn có thể thêm-maxdepth 0
để tránh đi xuống trong các thư mục có tên là Dir_01.png
hoặc find ./*.png -prune -exec ...
khi maxdepth không được phép (cảm ơn Stéphane). Nếu bạn muốn tránh liệt kê các thư mục đó, bạn nên thêm tùy chọn -type f
(cũng sẽ loại trừ các loại tệp không thường xuyên khác). Hãy nhìn vào man
bức tranh toàn cảnh đầy đủ hơn về tất cả các tùy chọn có sẵn và nhớ kiểm tra khi chúng tuân thủ POSIX, để có tính di động tốt hơn.
Một số từ nữa
Ví dụ, có thể xảy ra việc sao chép tiêu đề từ tài liệu và dán vào tên tệp, một hoặc nhiều dòng mới sẽ kết thúc bằng chính tên tệp. Chúng ta thậm chí có thể không may mắn đến mức một tiêu đề có thể chứa ngay cả khóa chúng ta phải sử dụng ngay trước dòng mới:
The new art of working on .png
files and other formats.
Nếu bạn muốn kiểm tra, bạn có thể tạo các tên tệp như thế này bằng các lệnh
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
Đơn giản /bin/ls *png
sẽ xuất?
thay vì các ký tự không in được
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
Trong tất cả các trường hợp bạn sẽ đặt đầu ra của lệnh ls
hoặc find
lệnh sau sẽ không có gợi ý nào để hiểu nếu dòng hiện tại đến từ một tên tệp mới hoặc nếu nó đi theo một ký tự dòng mới trong tên tệp tiền lệ . Một cái tên khó chịu thực sự, nhưng vẫn là một tên hợp pháp.
Một chu trình shell với Parameter-Expansion, ${parameter%word}
trong cả hai biến thể có printf
hoặc echo
sẽ hoạt động [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Từ trang man của Mở rộng tham số Shell [ 3 ]
$ {tham số% word}
$ {tham số %% word}
... kết quả của việc mở rộng là giá trị của tham số có mẫu khớp ngắn nhất (trường hợp '%') hoặc mẫu khớp dài nhất (trường hợp '%%') đã bị xóa.
.
trong đó. Mặc dù Công ước nói đến tên tập tin của bạn với.png
lúc kết thúc, không có lý do tại sao tôi không thể có một tập tin png tênfoo.zip
hoặcmy.picture.20160518
hoặc chỉmypic
.