it-swarm-vi.com

Cách liệt kê các tệp không có thư mục và lọc theo tên (tùy chọn ls)

Tôi có một thư mục gọi là uploads. Nó chứa một loạt các tệp, cộng với một vài thư mục con lần lượt chứa các tệp.

Có cách nào tôi có thể (trong một bước) làm như sau:

  1. Liệt kê CHỈ các tệp trong thư mục tải lên gốc - Tôi không muốn thấy tên thư mục con hoặc nội dung của chúng;

  2. KHÔNG liệt kê bất kỳ tệp nào bắt đầu bằng t_

Tôi biết về -d cờ, nhưng nó không giúp tôi đạt được điều mình muốn.

45
EmmyS

Điều này nghe có vẻ như một công việc cho find.

  • Sử dụng -maxdepth để chỉ trả về thư mục hiện tại, không tìm kiếm đệ quy bên trong các thư mục con
  • Sử dụng -type f chỉ trả lại tệp và không phải thư mục hoặc nút thiết bị hoặc bất cứ thứ gì khác
  • Sử dụng kết hợp nếu -not-name để tránh các tệp có tên bạn không muốn

Nó có thể đi cùng nhau như thế này:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
55
Caleb

GNU ls (tức là lệnh ls trên các hệ thống Linux không nhúng và Cygwin, cũng có sẵn trên một số thông báo khác) có một tùy chọn để ẩn một số tệp, dựa trên tên của chúng. Không có cách nào để bỏ qua các thư mục mặc dù.

ls --hide='t_*' uploads

Một cách tiếp cận khác là làm cho Shell của bạn thực hiện khớp. Bash, ksh và zsh có mẫu phủ định !(t_*) để khớp với tất cả các tệp ngoại trừ các tệp khớp với t*; trong bash, tính năng này cần được bật bằng shopt -s extglob và trong zsh, nó cần được bật bằng setopt ksh_glob. Zsh cũng có cú pháp tương đương ^t_* Cần được bật bằng setopt extended_glob. Điều này vẫn không bỏ qua các thư mục. Zsh có một tính năng bổ sung cho phép khớp các tệp không chỉ theo tên mà còn theo siêu dữ liệu và hơn thế nữa: vòng loại toàn cầ . Thêm (.) Vào cuối trận đấu để giới hạn các tệp thông thường. Phủ định ^ Là một phần của cú pháp khớp tên, vì vậy ^t_*(.) có nghĩa là tất cả các tệp thông thường không khớp với t_* Và không phải tất cả các tệp không khớp với các tệp thông thường t_*.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

Nếu bạn thấy mình không có các công cụ nâng cao, bạn có thể thực hiện việc này trên bất kỳ unix nào với find. Đây không phải là thứ bạn thường gõ trên dòng lệnh, nhưng nó mạnh mẽ và chính xác. Caleb đã chỉ ra cách thực hiện việc này với GNU find . Tùy chọn -maxdepth Không khả dụng, bạn có thể sử dụng -Prune thay vào đó, để ngăn chặn một cách hợp lý find khỏi đệ quy.

find uploads/* -type d -Prune -o \! -type f -name 't_*' -print

Thay thế -print Bằng -exec ls -lG -- {} + Để thực thi ls bằng các tùy chọn yêu thích của bạn trên các tệp.

Tất cả các lệnh trên đều ẩn các tệp chấm (nghĩa là các tệp có tên bắt đầu bằng .). Nếu bạn muốn hiển thị chúng, hãy chuyển -A Cho ls hoặc thêm vòng loại D trong zsh (ls uploads/^t_*(.D)). Với find, bạn có thể sử dụng một cách tiếp cận khác để làm cho nó chỉ lặp lại một cấp độ (find không xử lý các tệp chấm đặc biệt). Điều này chỉ hoạt động đầy đủ nếu bạn chạy find trong thư mục hiện tại.

cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$
1

Nếu vấn đề về tính di động -maxdepth của find là một mối quan tâm, bạn có thể sử dụng:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Tôi không phải là một chuyên gia, nhưng tôi nghĩ rằng điều này sẽ làm việc. Tôi cho rằng nó trông hơi khó hiểu, nhưng nếu bạn nói awk, thì thực sự không phải vậy. $ NF có thể được sử dụng thay vì $ 9. Bạn cũng có thể làm:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

cái nào làm điều tương tự (nhưng có lẽ kém hiệu quả hơn cái trước ???).

Trên thực tế, sau khi suy nghĩ về các bài viết khác, có vẻ như

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

là một cách thậm chí ngắn hơn và rõ ràng hơn.

Ai đó làm ơn sửa tôi nếu tôi sai. :-)

0
kkaszub

Tôi tìm thấy những cách ngắn này:

ls -p uploads | grep -Ev '/'

hoặc là

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

Hãy để tôi cho nó một shot bằng cách sử dụng ls và ống dẫn:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

nói cột cuối cùng là cột thứ 9.

0
Y0NG