Lặp lại từng dòng đầu ra ls -l


119

Tôi muốn lặp lại từng dòng trong đầu ra của: ls -l /some/dir/*

Ngay bây giờ tôi đang cố gắng: for x in $(ls -l $1); do echo $x; done

Tuy nhiên, điều này lặp lại từng phần tử trong dòng riêng biệt, vì vậy tôi nhận được:

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2

Nhưng tôi muốn lặp lại toàn bộ từng dòng. Làm thế nào để làm điều đó?


1
Luôn trích dẫn các biến (và đầu ra lệnh) trừ khi bạn có lý do cụ thể để không làm như vậy.
glenn jackman

Câu trả lời:


246

Đặt IFS thành dòng mới, như thế này:

IFS='
'
for x in `ls -l $1`; do echo $x; done

Đặt một sub-shell xung quanh nó nếu bạn không muốn đặt IFS vĩnh viễn:

(IFS='
'
for x in `ls -l $1`; do echo $x; done)

Hoặc sử dụng while | đọc thay:

ls -l $1 | while read x; do echo $x; done

Một tùy chọn khác, chạy trong khi / đọc ở cùng một cấp shell:

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF

12
Cẩn thận khi đường ống để thời gian, thời gian sẽ chạy trong một subshell, có nghĩa là nó không thể thay đổi các biến trong quá trình chính
Reorx

1
$ 1 đang làm gì ở đây? Tôi cần sử dụng điều này trong một tập lệnh mà tôi đang viết chấp nhận các đối số. $ 1 đang ném đi mọi thứ. Tôi có thể đặt gì ở đó thay vì $ 1 để có được hiệu quả tương tự? Tôi muốn sử dụng giải pháp thứ hai.
noob-in-need,

@ noob-in-need Thay thế nó bằng bất kỳ thư mục nào bạn muốn liệt kê
vpzomtrrfrt

1
Bạn có thể muốn làm read -rhoặc nếu không bash sẽ loại bỏ các dấu gạch chéo ngược không thoát khỏi dữ liệu.
Brian Gordon

6

Nó phụ thuộc vào những gì bạn muốn làm với mỗi dòng. awk là một tiện ích hữu ích cho kiểu xử lý này. Thí dụ:

 ls -l | awk '{print $9, $5}'

.. trên hệ thống của tôi in tên và kích thước của từng mục trong thư mục.


3

Như đã đề cập, awk là công cụ phù hợp cho việc này. Nếu bạn không muốn sử dụng awk, thay vì phân tích cú pháp đầu ra của từng dòng "ls -l", bạn có thể lặp lại tất cả các tệp và thực hiện "ls -l" cho từng tệp riêng lẻ như sau:

for x in * ; do echo `ls -ld $x` ; done

3

Bạn cũng có thể thử findlệnh. Nếu bạn chỉ muốn tệp trong thư mục hiện tại:

find . -d 1 -prune -ls

Chạy một lệnh trên mỗi người trong số họ?

find . -d 1 -prune -exec echo {} \;

Đếm dòng, nhưng chỉ trong tệp?

find . -d 1 -prune -type f -exec wc -l {} \;


tìm thấy bị hỏng. Thường nhận được một số thông báo lỗi kỳ lạ. nó muốn giúp tôi khi dòng lệnh hoàn toàn hợp lệ và có vẻ như một khi nó bắt đầu thực hiện việc này, nó sẽ không dừng lại cho đến khi khởi động lại MAYBE lần sau. nó đôi khi có vẻ ngẫu nhiên về bản chất liên quan đến lỗi. không chắc làm thế nào tôi có thể báo cáo lỗi.
Jim Michaels

1

Tiện ích read (1) cùng với chuyển hướng đầu ra của lệnh ls (1) sẽ thực hiện những gì bạn muốn.


-1

Vì vậy, tại sao không ai đề xuất chỉ sử dụng các tùy chọn loại bỏ những phần anh ta không muốn xử lý.

Trên Debian hiện đại, bạn chỉ cần lấy tệp của mình bằng:

ls --format=single-column 

Hơn nữa, bạn không cần phải chú ý đến thư mục bạn đang chạy nó trong nếu bạn sử dụng thư mục đầy đủ:

ls --format=single-column /root/dir/starting/point/to/target/dir/

Lệnh cuối cùng này tôi đang sử dụng ở trên và tôi nhận được kết quả sau:

bot@dev:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz
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.