Tìm tập tin theo thứ tự abc trước một chuỗi nhất định


8

Nếu tôi có một thư mục đầy đủ các tập tin và thư mục phụ. Cách tốt nhất để liệt kê chỉ các tệp thông thường nằm trong bảng chữ cái trước một chuỗi nhất định là gì?

Hiện tại cách tốt nhất tôi có thể làm bằng cách sử dụng bash là như sau:

for x in `find . -maxdepth 1 -type f | sort`
do
   if [[ "$x" > './reference' ]]
   then
      break
   fi

   echo $x
done

Tôi cảm thấy như có một cách ngắn gọn hơn để làm điều này, nhưng tôi không chắc nó là gì. Có ý kiến ​​gì không?

Câu trả lời:


4

nếu bạn cần tất cả chúng

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"'

nếu bạn cần đầu tiên

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'

Cảm ơn! Một biến thể về điều này để nhận tất cả các tệp giữa các biến đã cho sẽ là:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay

3

Với sednó ngắn gọn hơn:

$ find -maxdepth 1 -type f | sort | sed '/^\.\/reference/,$d'

Có nghĩa là (sau khi sắp xếp) xóa dòng tham chiếu (hoặc lớn hơn) và tất cả các dòng tiếp theo đến dòng cuối cùng.

Lệnh sed 'd' được sử dụng ở đây với phạm vi địa chỉ, trong đó '/ ^ ./reference/' là bắt đầu và '$' là kết thúc của phạm vi. (Và '$' là một địa chỉ có nghĩa là dòng cuối cùng.)



3

ví dụ. script-name "$HOME" "reference"... findkhông phải lúc nào cũng dẫn đầu ./, như trong trường hợp find bin, hoặc find /tmp. Vì vậy, nếu bạn chỉ muốn tên cơ sở tập tin, điều này hoạt động.

cập nhật: Đã thêm tolower () để cho phép so sánh không phân biệt chữ hoa chữ thường, tạo ra đối chiếu bảng chữ cái được đề cập trong câu hỏi ...

#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'

Chỉ cần đặt nó vào sortsau awk, nếu bạn cần nó được sắp xếp.


Điều này dường như không hoạt động. Tôi đã thay đổi phần cuối của tập lệnh awk thành $0 < refvà nó hoạt động, nhưng vì không có khoảng trắng nào trong đầu ra của trường tìm $ 2 không tồn tại. Tui bỏ lỡ điều gì vậy?
Mike Deck

Cảm ơn, tôi đã thực hiện một thay đổi nhanh chóng vào phút cuối và đã bỏ lỡ trường đó (ban đầu nó có hai trường được phân tách bằng \ xFF ) ... Bây giờ, tôi đã có một chút ngủ, tôi có thể thấy rằng nó không phải là xử lý trường hợp đúng. Tôi cho rằng như câu hỏi đề cập đến một đối chiếu theo thứ tự chữ cái , nó có nghĩa là trường hợp không nhạy cảm . Tôi đã cập nhật câu trả lời.
Peter.O
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.