Làm cách nào để chọn các tệp cụ thể trong một thư mục khác bằng cách sử dụng bash?


13

Tôi muốn liệt kê (hoặc xóa hoặc thực hiện một số thao tác khác) trên các tệp nhất định trong một thư mục, như sau:

$ ls /opt/somedir/
aa  bb  cc  aa.txt  bb.txt  cc.txt
$ ls /opt/somedir/(aa|bb|cc)  ## pseudo-bash :p
aa  bb  cc

Làm thế nào tôi có thể đạt được điều này (không có cd-ing vào thư mục trước)?

Câu trả lời:



3

Trong bash, hãy chạy shopt -s extglob(hoặc đặt nó vào trong của bạn ~/.bashrc) và bạn có thể sử dụng các mẫu bổ sung cung cấp các biểu thức chính quy với một cú pháp bất thường (được kế thừa từ ksh). Bạn cũng có thể sử dụng các mẫu này trong ksh, và cả trong zsh sau setopt ksh_glob.

$ shopt -s extglob
$ ls /opt/somedir/@(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Trong zsh, bạn có thể trực tiếp sử dụng (foo|bar)làm mẫu.

% ls /opt/somedir/(aa|bb|cc|doesnotexist)
/opt/somedir/aa   /opt/somedir/bb  /opt/somedir/cc

Lưu ý rằng lệnh được gọi với đường dẫn đầy đủ. Nếu bạn muốn gọi lệnh bằng một đường dẫn ngắn, bạn sẽ cần thay đổi thư mục bằng cách nào đó và (cd /opt/somedir && somecommand aa bb cc)cho đến nay là cách dễ nhất.


Nếu bạn nhìn kỹ, bạn sẽ thấy rằng tôi chỉ định "không có cd-ing vào thư mục trước" trong câu hỏi của tôi;)
neu242

1

Bạn có thể lọc bằng cách sử dụng egrep:

ls | egrep '(aa|bb|cc)'

Để tìm tất cả các tệp văn bản:

ls | egrep '(aa|bb|cc).txt'

1
dấu chấm sẽ khớp với mọi ký tự và cách tiếp cận này gây khó khăn cho hoạt động tiếp theo trên các tệp này
enzotib

1
Tôi có cảm giác rằng ls cũng chỉ là một lệnh ví dụ.
Random832

Vâng, bạn nói đúng, tôi đã chỉ định rằng tôi muốn thực hiện một thao tác: liệt kê các tệp chỉ là một ví dụ.
neu242

Ý kiến ​​tốt bạn thân mến, cảm ơn. Chúc may mắn neu242: D
Ocean

1

Đầu tiên, tôi hướng bạn đến: không bao giờ phân tích ls , bao giờ . Cách thích hợp và hợp quy để làm những gì bạn muốn là tìm .

Ví dụ:

find /opt/somedir -regex '.*[aa|bb|cc].*' -exec mv '{}' ~/backup \;

Tôi thường sử dụng -namethay vì -regexnó đơn giản hơn. Nhưng một regex phù hợp với trường hợp sử dụng của bạn. Bạn nên chạy lệnh mà không cần -exec lần đầu tiên, để đảm bảo chúng thực sự là các tệp bạn muốn di chuyển / xóa.


Tôi chưa bao giờ nói tôi phân tích ls, và Rush có câu trả lời tốt hơn nhiều. Tuy nhiên, cảm ơn bạn đã cố gắng :)
neu242
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.