Sắp xếp đầu ra của những người tìm thấy trên mạng?


77

Tôi cần có khả năng sắp xếp theo thứ tự abc đầu ra findtrước khi đưa nó vào một lệnh. Bước vào | sort |giữa không hoạt động, vậy tôi có thể làm gì?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

Câu trả lời:


52

Sử dụng findnhư bình thường và phân định các dòng của bạn với NUL. GNU sortcó thể xử lý chúng bằng công tắc -z:

find . -print0 | sort -z | xargs -r0 yourcommand

58

Một số phiên bản sort-ztùy chọn, cho phép các bản ghi kết thúc null.

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

Ngoài ra, bạn cũng có thể viết một tập lệnh cấp cao để thực hiện:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

Thêm -rtùy chọn để xargsđảm bảo rằng nó myCommandđược gọi với một đối số.


Tốt một (hai?) ... Thật thú vị, mặc dù vậy, hai phương thức xử lý .khác nhau ... Với sortviệc kết thúc ở cuối danh sách ... với pythonthứ hạng được xếp lên đầu. (có thể là trăn sắp xếp với LC_COLLATE=C)
Peter.O

Ngoài ra còn có -t \0tùy chọn để sắp xếp (đó là một -ztừ đồng nghĩa)
Javier

1
Vấn đề với tất cả các |sortgiải pháp này là bạn không thể sử dụng được -execnữa. OK, mặc dù có thể viết lại tuyên bố của bạn để -execnó hoạt động xargs, nhưng câu hỏi là, "mini-scripts" thì sao? ( sh -c ...) Tôi sẽ không gọi nó tầm thường để chuyển đổi một tập lệnh nhỏ 'sh -c' với nhiều lệnh để nó có thể hoạt động với xargs(nếu có thể, đó là)
cú pháp

@syntaxerror: Bạn gặp vấn đề gì khi sử dụng sh -c với xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate

4

Tôi nghĩ bạn cần -ncờ để sắp xếp #

Theo loại đàn ông:

-n, --numeric-sort
    compare according to string numerical value

biên tập

Print0 có thể có một cái gì đó để làm với điều này, tôi chỉ thử nghiệm điều này. Lấy print0 ra, bạn có thể hủy kết thúc chuỗi theo cách sử dụng -zcờ


Chà, điều đó print0dường như là phân tách không gian tên tập tin, đó là điều tôi cần phải truyền cho lệnh của mình, thật không may
Công nghiệp

1

Nếu bạn đã cài đặt GNU Parallel http://www.gnu.org/software/pool/, bạn có thể làm điều này:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

Bạn có thể cài đặt GNU Parallel đơn giản bằng cách:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Xem các video giới thiệu về GNU Parallel để tìm hiểu thêm: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Sự biện minh cho việc sử dụng GNU Parallel là gì? Để tăng tốc nó lên?
Peter Mortensen

Điều đó và bạn không cần phải lộn xộn với \ 0 hồ sơ được phân tách.
Ole Tange
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.