2013-01-23 34 views
5

Tôi có danh sách các thư mục dựa trên kết quả chạy lệnh "tìm" trong bash. Như một ví dụ, kết quả của tìm được các tập tin:Cách sắp xếp kết quả tìm kiếm (bao gồm thư mục lồng nhau) theo thứ tự abc trong bash

test/a/file 
test/b/file 
test/file 
test/z/file 

Tôi muốn sắp xếp đầu ra để nó xuất hiện như:

test/file 
test/a/file 
test/b/file 
test/z/file 

Có cách nào để sắp xếp các kết quả trong lệnh tìm kiếm, hoặc bằng cách chia các kết quả thành sắp xếp?

Trả lời

9

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.)

+1

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

+0

@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. –

-1

thử này. để tham khảo, nó đầu tiên sắp xếp trên trường thứ hai char thứ hai. mà chỉ tồn tại trên tập tin, và có một r cho đảo ngược có nghĩa là nó là lần đầu tiên, sau đó nó sẽ sắp xếp trên char đầu tiên của lĩnh vực thứ hai. [-t là dấu phân cách trường, -k là khóa]

find test -name file |sort -t'/' -k2.2r -k2.1 

làm một info sort để biết thêm thông tin. có rất nhiều cách khác nhau để sử dụng -t và -k cùng nhau để có được kết quả khác nhau.

+0

Đây là một cách đặc biệt và kludgy kỳ lạ để sắp xếp các tên tệp mẫu. Nó không phải là một giải pháp chung. –

Các vấn đề liên quan