Nếu bạn có phiên bản GNU của tìm kiếm, thử điều này:
find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}'
Để sử dụng các tên file trong vòng một, làm
find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' | while read file; do
# use $file
done
Phát hiện lệnh in ba điều cho mỗi tập tin: (1) thư mục của nó, (2) chiều sâu của nó trong cây thư mục, và (3) tên đầy đủ của nó. Bằng cách đưa độ sâu vào đầu ra, chúng tôi có thể sử dụng sort -n
để sắp xếp test/file
ở trên test/a/file
. Cuối cùng, chúng tôi sử dụng awk
để loại bỏ hai cột đầu tiên vì chúng chỉ được sử dụng để sắp xếp.
Sử dụng \0
làm dấu phân tách giữa ba trường cho phép chúng tôi xử lý tên tệp có dấu cách và tab trong đó (nhưng không may là dòng mới).
$ find test -type f
test/b/file
test/a/file
test/file
test/z/file
$ find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F'\0' '{print $3}'
test/file
test/a/file
test/b/file
test/z/file
Nếu bạn không thể sửa đổi lệnh find
, sau đó thử thay thế này phức tạp:
find test -type f | while read file; do
printf '%s\0%s\0%s\n' "${file%/*}" "$(tr -dc/<<< "$file")" "$file"
done | sort -t '\0' | awk -F'\0' '{print $3}'
Nó làm điều tương tự, với ${file%/*}
đang được sử dụng để có được tên thư mục của tập tin và tr
lệnh được sử dụng để đếm số lượng dấu gạch chéo, tương đương với "độ sâu" của tệp.
(Tôi chắc chắn hy vọng có một câu trả lời dễ dàng hơn ra khỏi đó. Những gì bạn đang yêu cầu dường như không phải là khó, nhưng tôi tẩy trống trên một giải pháp đơn giản.)
Nguồn
2013-01-23 23:12:28
Tôi đang sử dụng lệnh này như một phần của tập lệnh bash của tôi. Tốt hơn là tôi đã hy vọng tôi có thể làm một cái gì đó dọc theo dòng: 'cho tập tin trong tìm ... | sắp xếp ... ' – Ken
@Ken Xem bản chỉnh sửa của tôi. 'tìm ... | trong khi đọc tập tin' nên được ưa thích hơn 'cho tập tin trong $ (tìm ...)'. Sau này không phải là khoảng trắng an toàn, chậm hơn và có thể bị lỗi nếu có quá nhiều tên tệp để vừa với dòng lệnh. –