Làm thế nào để tôi lặp lại chỉ 1 cột đầu ra từ lệnh ls?


54

Hãy nói khi tôi thực hiện lệnh ls, đầu ra là:

file1 file2 file3 file4

Có thể chỉ hiển thị một cột đầu ra nhất định, trong trường hợp này là file2? Tôi đã thử những điều sau đây nhưng không thành công:

echo ls | $2

Về cơ bản tất cả những gì tôi muốn làm là chỉ lặp lại cột thứ hai, trong trường hợp này, tôi muốn lặp lại:

file2

2
Một tình huống trong đó bạn thực sự muốn có một là gì cột của lsđầu ra?
michas

11
Theo nguyên tắc chung, bạn không bao giờ nên phân tích ls . Hầu như luôn luôn có những cách tốt hơn để có được thông tin bạn cần.
terdon

Tôi sẽ không làm người lạ đó: P (xin lỗi tôi luôn thích cụm từ đó) số lượng cột phụ thuộc vào tên tệp và thư mục có, vì vậy cột thứ 2 có thể là cột bạn muốn, hoặc có thể không, hoặc có thể trong một lsvà Sau khi tạo một số tệp / thư mục, nó có thể không còn là thứ bạn muốn. Như terdon đã chỉ ra, chắc chắn có những cách tốt hơn để có được những gì bạn muốn
YoMismo

Câu trả lời:


81

Lệnh sau sẽ định dạng đầu ra ls thành một cột

ls -1 /directory

2
Nhưng nó không cung cấp cho bạn chỉ một cột mà OP quan tâm.
Anthon

1
Để làm cho chính xác: ls -1 /directory | head -2 | tail -1hoặcls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'có vẻ đơn giản hơn
Fiximan

3
Câu trả lời tôi đang tìm kiếm, nhưng không phải cho câu hỏi của OP.
Michael Lang

36

Bạn đang tìm kiếm điều này:

ls -C | awk '{ print $2 }'

Tuy nhiên, giả sử bạn sẽ thử và sử dụng tên tệp này sau, đừng làm điều này, vì nó sẽ phá vỡ tên tệp chứa khoảng trắng. Thay vào đó, hãy đặt các tệp vào một mảng và lấy tệp thứ hai để tránh phải thực hiện bất kỳ phân tích cú pháp nào:

files=(*)
printf '%s\n' "${files[1]}"

Thứ tự mà bạn lấy lại các tập tin phụ thuộc vào giá trị của LC_COLLATE. Như vậy, bạn có thể muốn đặt LC_COLLATE=Cđầu tiên, nếu bạn muốn sắp xếp "tiêu chuẩn" trong tất cả các trường hợp góc.


Lưu ý rằng các chỉ số mảng bắt đầu ở các 1vỏ hợp lý (zsh, yash, fish, csh, tcsh, rc, es ...) và tại 0ksh và bash. Đối với một giải pháp di động cho tất cả các vỏ giống như Bourne, bạn có thể sử dụng: set -- *; printf '%s\n' "$2"thay vào đó.
Stéphane Chazelas

@ StéphaneChazelas Ít nhất cho câu hỏi này, các thẻ bao gồm "bash", vì vậy câu trả lời này là dành riêng cho vỏ đó.
Chris Down

ls -C | awk '{print $ 1} có vẻ cho cùng một đầu ra ... tại sao $ 2?
boctulus

7

Bạn sẽ cần phải thêm -Cnhư lssử dụng chế độ cột đơn khi đầu ra không phải là thiết bị đầu cuối. awksau đó in cột thứ hai:

ls -C | awk '{print $2}'

2

Tôi nghĩ bạn đang tìm kiếm

ls -1

Nó sẽ không hiển thị quyền, chủ sở hữu, nhóm, ngày, kích thước ... nhưng tên tệp đơn giản trong một cột.


1
Câu trả lời này không chỉ sai mà còn được đưa ra trước đây.
Scott

Mặc dù tôi nhận ra điều này là sai đối với câu hỏi ban đầu, nhưng đó là điều tôi đang tìm kiếm. Cảm ơn bạn.
AntumDeluge

0

Cách duy nhất làm việc với tôi là thêm "-all". Đó là:

ls -C -all | awk '{ print $1 }'

Bởi vì -allthêm nhiều cột như người dùng, quyền, v.v.


0

Như đã được đề cập - sử dụng các cột để phân tích cú pháp lsđầu ra không mạnh mẽ lắm vì lsphá vỡ các dòng theo độ dài tên tệp và độ rộng của thiết bị đầu cuối. Nó thường là thú vị mặc dù để hiển thị một cột duy nhất của một danh sách các yếu tố. Bạn có thể làm điều này bằng cách sử dụng lệnh cắt:

echo file1 file2 file3 file4 | cut -d" "  -f2

sẽ hiển thị

file2

Lưu ý rằng -dcho phép bạn chọn dấu phân cách cột, ví dụ như với

cur -d, -f2

bạn có thể hiển thị cột thứ hai của danh sách được phân tách bằng dấu phẩy.


0

Giả sử nếu bạn muốn chỉ hiển thị tên tệp cụ thể trong đường dẫn hiện tại, hãy sử dụng lệnh bên dưới

chỉ huy:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

Điều này là khó khăn, bởi vì phân tích cú pháp ls -Cphụ thuộc vào:

  1. độ dài tên tệp, (chính nó phụ thuộc vào danh sách tệp được chỉ định truyền vào ls -C)
  2. chiều rộng thiết bị đầu cuối.
  3. thực tế là ls -Cđầu ra là cột, nhưng có thể được cấu hình để thay đổi số lượng khoảng trắng dưới dạng dấu tách trường.
  4. khả năng khoảng trắng trong tên tệp, (màn hình hiển thị phụ thuộc vào các lstùy chọn hiển thị cụ thể được chọn).

Bây giờ, hãy bắt đầu với vấn đề dễ dàng hơn, ( không phải số 4 ở trên), giả sử rằng không có khoảng trắng trong tên tệp . Để in cột số 2, công việc này:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Bỏ kiểm tra rằng:

  • COLUMNS=$COLUMNSđảm bảo rằng độ dài cột được cung cấp | vẫn phù hợp với màn hình thiết bị đầu cuối hiện tại. Thay đổi giá trị này thành một giá trị tùy ý cũng hoạt động, do đó COLUMNS=50hoặc COLUMNS=70 sẽ gây ra ls -Cviệc sắp xếp lại mọi thứ theo các chiều rộng đó.

    Một phương pháp khác là sử dụng công -wtắc, ví dụ :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trlàm cho các dấu tách trường nhất quán: một tab duy nhất giữa mỗi cột.

  • cut xuất ra cột mong muốn.


Phương thức khoảng trắng đang chờ xử lý ...
agc

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

thay đổi số lượng ký tự (54) nếu cần để bạn chỉ nhận được dữ liệu bạn muốn.


2
để làm rõ, sử dụng lệnh 54-cắt cho mọi nhân vật bắt đầu từ vị trí 54; nó không dừng lại ở cột "được con người công nhận"
Jeff Schaller

Đó không phải là một ý tưởng tồi..chỉ cần phải được tinh chế.
Phổ
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.