Có thể xóa tiền tố thư mục khỏi lệnh `ls`


12

Tôi đang ở trong một tập lệnh bash và tôi muốn lấy danh sách tất cả các tệp (giả sử tất cả các tệp jar). Tôi thực hiện lệnh ls -1 lib/*.jarvà tôi nhận được đầu ra:

lib/mylib_1.jar
lib/mylib_2.jar
...

Có tùy chọn nào để có đầu ra sau:

mylib_1.jar
mylib_2.jar
...

Thực hiện cd libtrước đây không phải là một tùy chọn vì tôi đang ở trong một vòng lặp và cần phải ở trong thư mục mẹ cho các hành động tôi muốn thực hiện trong vòng lặp.

Tôi đã cố gắng tìm thông tin bằng cách gõ man lsnhưng tôi không tìm thấy giải pháp nào.

Một giải pháp với một lệnh khác sẽ tốt miễn là tôi có thể đưa nó vào lslệnh của mình hoặc tự cung cấp.


Bạn đang làm gì với tên của những tập tin đó? Bạn chỉ liệt kê chúng vào thiết bị đầu cuối, hoặc bạn đang chuyển chúng đến một chương trình hoặc tập lệnh khác (riêng lẻ hoặc dưới dạng danh sách)? Cách chính xác để xử lý việc này phụ thuộc vào cách sử dụng tên tệp.
Kusalananda

Ý tưởng là thực hiện một số thống kê về libs của bên thứ ba trong một dự án java đa mô-đun. Tôi chỉ muốn danh sách và thực hiện một sắp xếp và uniq sau
рüффп

Câu trả lời:


19

Thay vì phân tích ls, bạn nên sử dụng findthay thế. Sau đó, bạn cũng có thể thực thi basenametrên mỗi tệp để loại bỏ các thư mục hàng đầu:

find lib/ -name '*.jar' -exec basename {} \;

Ok cách này là hoàn hảo cho tôi là tốt.
hôm nay

3
Cũng xem -maxdepthtùy chọn.

13

Với GNU find, không cần phải chạy basenamecho mọi tệp đơn lẻ, việc này sẽ nhanh hơn nhiều (đặc biệt là nếu có nhiều tệp):

find lib -name '*.jar' -printf '%P\n'

11

Còn về việc (cd lib && echo *.jar), giả sử rằng bạn không có khoảng trắng hoặc ký tự đặc biệt trong tên tệp. Kịch bản cha mẹ không bao giờ thay đổi thư mục.


Không gian cũng không phải là một vấn đề.
terdon

Đây là một ý tưởng tốt và có lẽ sẽ là lựa chọn nhanh nhất. Tôi sẽ làm printf '%s\n' *.jarđể có được mỗi tập tin trên một dòng khác nhau mặc dù.
Graeme

Hoặc thậm chí printf '%s\0' *.jarđể loại bỏ các vấn đề về khoảng trắng (mặc dù đây không phải là Q).
Graeme

5

Như Josh Jolly đã nói trong câu trả lời của anh ấy, bạn không bao giờ nên phân tích ls, thay vào đó hãy sử dụng cách tiếp cận trong câu trả lời của anh ấy. Tuy nhiên, đây là một awkgiải pháp để xóa đường dẫn khỏi tên tệp, chỉ không sử dụng nó với ls:

find . | awk -F'/' '{print $NF}'

Các -F'/'bộ tách lĩnh vực để /có nghĩa là trường cuối cùng, $NFsẽ là tên tập tin.


1

findcó lẽ là con đường để đi, nhưng nếu bạn thực sự, thực sự làm (bạn không) muốn lột lib/từ ls -1, bạn có thể sử dụng sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

Bạn có thể làm điều này bằng cách sử dụng xargs với tham số --max-args (hoặc bí danh ngắn hơn -n):

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

Lưu ý rằng chúng tôi sử dụng --quoting-style=cđể đảm bảo khoảng trắng trong tên tệp không làm hỏng xargs.


Tôi đã không nhận thấy điều đó. Cảm ơn bạn! Tìm thấy đá quý này trên một trao đổi ngăn xếp khác. Bạn có thể giới thiệu dấu ngoặc kép cho kết quả ls với --quote-style = c. Vì vậy, lệnh đầy đủ kết quả sẽ là: `ls --quote-style = c -1 lib / *. Jar | xargs --max-args 1 tên cơ sở`
yoni

-1

Một cách khác để giải quyết truy vấn của bạn là liệt kê tất cả các tệp bằng cách sử dụng ls -R. Kết hợp đầu ra của lệnh ls với grep để chỉ liệt kê các tệp .jar. Bạn có thể sử dụng lệnh sau để thực hiện tương tự cho truy vấn của mình:

ls -R lib | grep jar| grep -v jar*

Điều này sẽ thất bại nặng nề nếu có một thư mục con cũng chứa các tệp jar hoặc một tệp có tên ví dụ "list-of-jars.txt".
Jules

grep -v jar * sẽ lọc kết quả với tệp có tên như ví dụ được trích dẫn của bạn.
joshi.mohit86

thật. nó cũng sẽ lọc ra tất cả các tập tin dự định. Bây giờ tôi nhìn lại, tôi có thể thấy không có trường hợp nào lệnh mà bạn đề xuất thực sự tạo ra bất kỳ đầu ra nào cả ...
Jules

Không, nó sẽ hiển thị các tệp như mylib_2.jarvà lọc ra các tệp như list-of-jars.txt.
joshi.mohit86

Không, nó không. Tôi chỉ thử nó. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> không có đầu ra nào cả.
Jules
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.