Làm cách nào để liệt kê * .tar.gz, một tên tệp trên mỗi dòng?


8

Tôi đang cố gắng liệt kê mọi .tar.gztập tin, chỉ sử dụng lệnh sau:

ls *.tar.gz -l

... Nó cho tôi thấy danh sách sau đây:

-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file1.tar.gz
-rw-rw-r-- 1 osm osm  949 Nov 27 16:17 file2.tar.gz

Tuy nhiên, tôi chỉ cần liệt kê nó theo cách này:

file1.tar.gz 
file2.tar.gz

và cũng không:

file1.tar.gz file2.tar.gz

Làm thế nào là "đúng" được thực hiện?


6
đó là một thói quen tốt để sử dụng các tùy chọn trước tên tập tin. và bạn cần sử dụng -1 thay vì -l
AnonymousLurker

17
ls -1 *.tar.gz, nhưng bạn muốn sử dụng danh sách này để làm gì? Nếu bạn đang làm gì đó với tên tập tin đó, thì đó lskhông phải là cách đúng đắn để làm điều đó. Xem tại sao * không * phân tích `ls` (và làm gì để thay thế)?
Kusalananda

3
hướng dẫn bạn cần là man ls. Đảm bảo rằng phông chữ hiển thị của bạn có độ tương phản tốt giữa 1 (một) và l (chữ thường chữ ell).
ctrl-alt-delor

3
Bản sao đầu ra
Julien Lopez

Câu trả lời:


39

Các -1tùy chọn (các chữ số “một”, không hạ thấp hợp cụ thể “L”) sẽ liệt kê một tập tin trên mỗi dòng không có thông tin khác:

ls -1 -- *.tar.gz

1
Tại sao dấu gạch ngang kép? ls -1 *.tar.gzhoạt động tốt như vậy.
RonJohn

8
@RonJohn nó tránh được những bất ngờ với tên tập tin bắt đầu bằng -.
Stephen Kitt

5
Cụ thể ... Nói rằng tôi là một kẻ tấn công, và có những file sau: .hiddenfile, benign.php, evil.bin, --hide=*evil*; không có --bạn sẽ không nhìn thấy evil.bin hoặc --hide=*evil* .
wizzwizz4

Tôi hoàn toàn thất vọng rằng không có -2(hoặc -3, v.v.)! ;-)
Peter - Tái lập Monica

1
(... Điều đó khiến tôi phải ngước nhìn columns!)
Peter - Tái lập Monica

19

Nếu bạn chỉ cần tên tệp, bạn có thể sử dụng printf:

printf '%s\n' *.tar.gz

... Shell sẽ mở rộng *.tar.gzký tự đại diện sang tên tệp, sau đó printfsẽ in chúng, với mỗi dòng theo sau là một dòng mới. Đầu ra này sẽ khác một chút so vớils trong trường hợp tên tệp có dòng mới được nhúng trong chúng:

thiết lập

$ touch file{1,2}.tar.gz
$ touch file$'\n'3.tar.gz

ls

$ ls -1 -- *.tar.gz
file1.tar.gz
file2.tar.gz
file?3.tar.gz

in

$ printf '%s\n' *.tar.gz
file1.tar.gz
file2.tar.gz
file
3.tar.gz

6
Xem thêm ls -b, ls -Q, ls --quoting-style=....
Stephen Kitt

printf '%q\n'. (Cả GNU.)
dave_thndry_085

9

lshành xử khác nhau khi đầu ra của nó được đường ống. Ví dụ:

ls          # outputs filenames in columns
ls | cat    # passes one filename per line to the cat command

Vì vậy, nếu bạn muốn xem tất cả các *.tar.gztệp của mình , mỗi tệp một dòng, bạn có thể thực hiện việc này:

ls *.tar.gz | cat

Nhưng nếu bạn không muốn đầu ra thì sao? Đó là, có cách nào để buộc lsđầu ra tên tập tin thành một dòng mà không cần đầu ra không?

Vâng, với công -1tắc. (Đó là dấu gạch ngang với số 1.) Vì vậy, bạn có thể sử dụng các lệnh sau:

ls -1             # shows all (non-hidden) files, one per line
ls -1 *.tar.gz    # shows only *.tar.gz files, one per line

7

Hoặc với GNU find:

find  -name "*.tar.gz"  -printf '%P\n'

Ngược lại lsvới *nó sẽ tìm kiếm .tar.gzcác tệp đệ quy:

$ find  -name "*.tar.gz"  -printf '%P\n'
file1.tar.gz
dir/file3.tar.gz
file2.tar.gz

Tại sao -printf '%P\n'chứ không phải chỉ -print- tại thời điểm nào thì bất kỳ tương thích Posix nào findcũng sẽ hoạt động.
Martin Bonner hỗ trợ Monica

@MartinBonner vì -printsẽ thêm ./trước tên tệp.
Arkadiusz Drabchot

4

Một hơi vòng xoay ngày càng điên rồ cách:

for i in *.tar.gz; do
    echo "$i"
done

EDIT: thêm dấu ngoặc kép để xử lý tên tập tin kỳ lạ


5
touch -- '-e \a.tar.gz'vì một lý do để trích dẫn các biến của bạn và unix.stackexchange.com/q/65804/117549 vì lý do sử dụng printf thay vì echo
Jeff Schaller

oof, tôi chỉ mất 5 phút để cố gắng tìm ra cách xóa -e \a.tar.gztệp kết quả
snetch

3
lấy làm tiếc! rm -- '-e \a.tar.gz'nên thực hiện mánh khóe
Jeff Schaller

Bạn tốt, đó là một bài học, và tôi đã học được điều đó --cho rmnhiều người khác.
snetch

@JeffSchaller: giải pháp khác cho tên địa phương làrm_etc './-x blah'
dave_thndry_085
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.