Làm cách nào để tôi chọn một trường / cột từ đầu ra của `ls -l`?


22

Mục tiêu của tôi rất đơn giản (ít nhất là với tôi). Tôi muốn lấy đầu ra của ls -lhoặc ls -lhvà chỉ chọn một trường.

Tôi đang tìm kiếm điều này để chống đạn càng tốt, theo ý tôi, giả sử rằng tên tệp có thể có số lượng không gian thay đổi, không phải mọi thứ trong trường đều có cùng độ dài, v.v.

Điểm thưởng cho việc có một tập lệnh sẽ lấy tên của trường (hoặc thậm chí chỉ là số trường), sau đó trả về nội dung của trường.

Tôi muốn biến

nhập mô tả hình ảnh ở đây

vào:

nhập mô tả hình ảnh ở đây

Câu trả lời:


41

Hãy thử ls -l | awk '{print $7}'.

awk chọn các cột sao cho hoàn hảo cho nhiệm vụ này.


3
Như được giải thích bởi @ormaaj: Đừng dựa vào những mẩu thông tin có sẵn ở những nơi cụ thể với ls. Các findlệnh là cực kỳ hữu ích.
Paddy Landau

@PaddyLandau Làm cách nào để sử dụng lệnh find để in kích thước tệp tính bằng megabyte như tôi có thể với ls -l --block-size=M?
Sur ngạc nhiên

@Benjamin - lsLệnh không phải là tiêu chuẩn POSIX, do đó, một tập lệnh phụ thuộc vào lscó thể bị hỏng trên các hệ thống khác nhau hoặc thậm chí theo thời gian. Xem câu trả lời của @ormaaj trên trang này để biết thêm chi tiết. Một cách để làm những gì bạn yêu cầu là với một vòng lặp Bash. Đây là một ví dụ. for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done. Tất nhiên, thay vì echo, bạn sẽ sử dụng quy trình của mình.
Paddy Landau

@PaddyLandau Tôi vừa kết thúc đường ống đầu ra của lệnh find để ... | xargs -d '\n' du -mhoạt động tốt như vậy.
Sur ngạc nhiên

@Benjamin Bạn có thể muốn xem xét -exectùy chọn find.
Paddy Landau

17

Không bao giờ phân tích ls . Sử dụng GNU find. Hoặc nếu tính di động không quan trọng , stat(1).

find . -maxdepth 1 -printf '%Td\n'

Để đọc dữ liệu ngoài danh sách tên tệp theo từng dòng và chia thành các trường, hãy xem: BashFAQ / 001

Không có phương pháp nào đáng tin cậy để đọc một danh sách tên tệp được phân định bằng dòng mới có ý nghĩa trong hầu hết các trường hợp.


1

Bạn có thể tìm nạp cột cụ thể trong shell như:

ls -al | while read perm bsize user group size month day time file; do echo $day; done

hay awknhư trong @Corey câu trả lời , cut -c44-45cũng sẽ làm việc sau khi điều chỉnh (vì lsđã cố định cột), hoặc bất cứ điều gì khác, tuy nhiên vấn đề chính là nó sẽ không đáng tin cậy và chống đạn (ví dụ trên Unix nó có thể là $6, không $7, và nó thay đổi tùy thuộc vào đối số) làm cho nó không thân thiện với máy do đó không nên phân tích lslệnh .

Tốt nhất là sử dụng các lệnh có sẵn khác nhau như find, hoặc statcó thể cung cấp các tùy chọn có liên quan để định dạng đầu ra khi bạn cần. Ví dụ:

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

Để trả về cột chỉ vài ngày sửa đổi, hãy thử ví dụ này:

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

Cần lưu ý rằng GNU statcó thể có các tùy chọn khác nhau đối với BSD stat, do đó, nó vẫn không thể chống đạn trên các hệ điều hành khác nhau.


1
+1 để đề cập rằng ls không nên được phân tích cú pháp cũng như sử dụng stat. datetuy nhiên được thiết lập không chính xác. Bạn nên thêm --date=$ymd, vì datebản thân nó sẽ in ngày hiện tại, nhưng mục đích ở đây là để chuyển đổi định dạng ngày của tệp
Sergiy Kolodyazhnyy

Các ls -la | cut -c32-33lệnh trong tổng trung thực chỉ là hoàn toàn không đáng tin cậy, không chỉ vì những cạm bẫy có thể với tên tập tin, nhưng đơn giản chỉ vì nó phụ thuộc vào chiều dài và trên các tập tin các tên người dùng kích thước. Các stat -c "%x" *.*lệnh trông ok, nhưng bằng cách sử dụng *.*bạn đang restricing nó chỉ để tên tập tin chứa một dấu chấm. Tôi đoán ý định là để bắt các tập tin cũng ẩn; trong trường hợp đó, bạn nên kích hoạt tính năng globalbing cho dotfiles trước và sử dụng *thay vì *.*: shopt -s dotglob; stat -c "%x" * | [...].
kos

Ah và những gì Serg nói cũng vậy, bạn nên thêm --date="$ymd"vào datelệnh, nếu không nó sẽ in ngày hiện tại của tháng.
kos

Cảm ơn các ý kiến. Tôi đã giải quyết các vấn đề và cung cấp một ví dụ ban đầu tốt hơn.
kenorb
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.