Nói với `ls` chỉ in tên tệp cơ sở


21

Đây là hành vi mặc định của ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

Làm thế nào để tôi lschỉ in tên cơ sở? Giống:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

Lưu ý : Tôi thích shell shell hơn findkhi sử dụng as / net / Nas / data / Languages ​​/ pypm / site / rex / free chứa số lượng lớn tệp và thư mục.


1
Bạn thích shell globalbing QUÁ bằng cách sử dụng find khi thư mục chứa nhiều tệp? lỗi đánh máy ??
akira

1
Tôi đoán rằng OP không muốn có một danh sách các thư mục con và không biết về tùy chọn chuyển -maxdepth 1đến find.
trực giác

Câu trả lời:


19

Mặc dù xargs -0được dự định sẽ được sử dụng cho đầu vào được phân tách bằng \ 0 (như find -print0), lsnhưng không có tùy chọn nào như vậy để phân định đầu ra của nó theo cách này.

Tuy nhiên,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

sẽ thực hiện thủ thuật để chuyển đổi dòng mới thành null trên đường đi. Điều này sau đó cho phép xargs hoạt động với các tên có khoảng trắng.

EDIT: được thêm -n 1vào xargs


Điều này không hoạt động đối với tôi: basename: extra operand \ 033 [0m / net / Nas / data / Languages ​​/ pypm / site / rex / free / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m'`
Srid nói Phục hồi lại

@Sridhar: bạn có thể cần một -n 1gợi ý ở nơi khác như một lựa chọn xargs? (câu trả lời được chỉnh sửa)
Steve Folly

Mặc dù cá nhân tôi thích câu trả lời của riêng mình (vì tôi gần như không bao giờ phải xử lý khoảng trắng trong tên tệp), tôi sẽ đánh dấu đây là câu trả lời cho nó cũng xử lý khoảng trắng.
Srid nói Phục hồi lại

Nếu phiên bản mac của xargs hỗ trợ -dtùy chọn (dấu phân cách), bạn có thể làm ls ... | xargs -d '\n' -n 1 basename.
trực giác

12

Tôi sử dụng cái này:

ls | tr '\n' '\n'

Nó đưa ra một danh sách như:

file1.mp3
file2.mp3
file3.mp3
...

3
Điều này về cơ bản giống như ls -1(và tắt màu), như lsngụ ý những điều đó khi không ghi vào thiết bị đầu cuối. Có vẻ như bạn đang thiếu điểm một chút, vì vấn đề là tước tên thư mục, sau đó chỉ định lsđối số đường dẫn bằng cách sử dụng thẻ hoang dã. Hãy thử ls -d "$PWD/"* | tr '\n' '\n'xem vấn đề thực tế là gì.
Daniel Beck

-1 - không chắc chắn tại sao mọi người tiếp tục nâng cao câu trả lời này. Nó không chỉ làm điều tương tự như vậy ls -1, nó cũng không hoạt động khi các khối u được sử dụng, như Daniel Beck chỉ ra.
slhck

-1 - Điều này giống như ls -1và chỉ hoạt động trong thư mục hiện tại, không phải với một đường dẫn như ls path/*.
Brendan Byrd


4

awk giải pháp:

ls -1 /path/glob | awk -F'/' '{print $NF}'

2

ls [đường dẫn tùy chọn] | xargs -0 tên cơ sở


2
-1: Tôi không thể phân định tên theo \ 0, đây là thứ xargs -0đang tìm kiếm.
Steve Folly


1

Bạn nói rằng bạn thích toàn cầu hơn find, nhưng bạn có biết rằng cả hai không loại trừ lẫn nhau? Globbing xảy ra trên bất kỳ lệnh nào bạn chạy, không chỉ ls. Ví dụ:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

Lưu ý rằng ví dụ tìm kiếm có thể sử dụng -print0, tiện dụng nếu đường dẫn của bạn chứa khoảng trắng (các trgiải pháp dựa trên được đề cập ở nơi khác hoạt động tốt trên không gian bình thường, nhưng không phải trên các tệp chứa dòng mới thực tế).

Cuối cùng, nếu bạn có quyền truy cập vào GNU find, bạn cũng có thể sử dụng -printf để tránh cuộc gọi tên cơ sở hoàn toàn:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'

Thật không may, -printftùy chọn không có sẵn trong phiên bản MacOSX find.
Srid nói phục hồi Monica

Cuộc gọi tốt; xin lỗi vì sự giám sát Tôi đã cập nhật câu trả lời.
Ryan Sáng

-3

đi đến thư mục nơi bạn có tất cả các tập tin và loại.

find *.pypm

1
OP tuyên bố rõ ràng rằng anh ta không muốn sử dụng find.
gronostaj

1
Ngoài ra, điều này thậm chí không làm những gì OP cần. (Lưu ý: Bạn nên sử dụng find . -name '*pypm'nếu ở tất cả ... chỉ cần đặt glob tiếp theo để tìm đạt được gì - sau đó bạn có thể chỉ cần viết ls *.pypm.)
slhck
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.