Bagaimana saya menggemakan 1 kolom output dari perintah ls?


54

Katakanlah ketika saya melakukan perintah output adalah:

file1 file2 file3 file4

Apakah mungkin untuk menampilkan hanya kolom output tertentu, dalam hal ini file2? Saya telah mencoba yang berikut ini tanpa hasil:

echo ls | $2

Pada dasarnya yang ingin saya lakukan hanyalah menggemakan kolom kedua, dalam hal ini, saya ingin menggema:

file2

2
Apa adalah situasi di mana Anda benar-benar ingin kolom dari lskeluaran?
michas

11
Sebagai aturan umum, Anda tidak boleh menguraikan . Hampir selalu ada cara yang lebih baik untuk mendapatkan informasi yang Anda butuhkan.
terdon

Saya tidak akan melakukan orang asing itu: P (maaf saya selalu suka frasa itu) jumlah kolom tergantung pada nama file dan folder, jadi kolom 2 mungkin yang Anda inginkan, atau mungkin tidak, atau mungkin dalam satu lsdan setelah membuat beberapa file / folder mungkin tidak lagi seperti yang Anda inginkan. Seperti yang ditunjukkan terdon di sana, pasti ada cara yang lebih baik untuk mendapatkan yang Anda inginkan
YoMismo

Jawaban:


82

Perintah berikut akan memformat output ls menjadi satu kolom

ls -1 /directory

2
Tapi itu tidak memberi Anda hanya satu kolom OP tertarik.
Anthon

1
Untuk memperbaikinya: ls -1 /directory | head -2 | tail -1atauls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'tampaknya lebih sederhana
Fiximan

3
Jawaban yang saya cari, tetapi bukan untuk pertanyaan OP.
Michael Lang

36

Anda sedang mencari ini:

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

Namun, dengan asumsi Anda akan mencoba dan menggunakan nama file ini nanti, jangan lakukan ini, karena akan merusak nama file yang mengandung spasi. Sebagai gantinya, letakkan file ke dalam array, dan dapatkan yang kedua, yang menghindari keharusan melakukan parsing sama sekali:

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

Urutan pengembalian file tergantung pada nilai LC_COLLATE. Dengan demikian, Anda mungkin ingin mengatur LC_COLLATE=Cterlebih dahulu, jika Anda menginginkan pengurutan "standar" di semua kotak sudut.


Perhatikan bahwa indeks array dimulai dengan 1shell yang masuk akal (zsh, yash, fish, csh, tcsh, rc, es ...) dan di 0dalam ksh dan bash. Untuk solusi portabel untuk semua cangkang mirip Bourne, Anda dapat menggunakan: set -- *; printf '%s\n' "$2"sebagai gantinya.
Stéphane Chazelas

@ StéphaneChazelas Setidaknya untuk pertanyaan ini, tag menyertakan "bash", jadi jawaban ini khusus untuk shell itu.
Chris Down

ls -C | awk '{print $ 1} terlihat memberikan output yang sama ... mengapa $ 2?
boctulus

7

Anda perlu menambahkan -Ckarena lsmenggunakan mode satu kolom ketika output bukan terminal. awklalu cetak kolom kedua:

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

2

Saya pikir Anda sedang mencari

ls -1

Itu tidak akan menampilkan izin, pemilik, grup, tanggal, ukuran ... tetapi nama file sederhana dalam satu kolom.


1
Tidak hanya jawaban ini salah, tetapi sudah diberikan sebelumnya.
Scott

Meskipun saya menyadari ini salah untuk pertanyaan awal, itu yang saya cari. Jadi terima kasih.
AntumDeluge

0

Satu-satunya cara bekerja bagi saya adalah menambahkan "-semua". Itu adalah:

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

Karena -allmenambahkan lebih banyak kolom seperti pengguna, izin, dll.


0

Seperti yang telah disebutkan - menggunakan kolom untuk parsing lsoutput tidak terlalu kuat karena lsmemecah garis sesuai dengan panjang nama file dan lebar terminal. Meskipun sering menarik untuk menampilkan satu kolom dari daftar elemen. Anda dapat melakukan ini menggunakan perintah cut:

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

akan ditampilkan

file2

Catatan yang -dmemungkinkan Anda untuk memilih pembatas kolom, jadi misalnya dengan

cur -d, -f2

Anda dapat menampilkan kolom kedua dari daftar yang dipisahkan koma.


0

Misalkan jika Anda ingin menampilkan hanya nama file tertentu di bawah jalur saat ini, gunakan perintah di bawah ini

perintah:

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

0

Ini rumit, karena parsing ls -Ctergantung pada:

  1. panjang nama file, (yang itu sendiri tergantung pada daftar file yang ditentukan diteruskan ke ls -C)
  2. lebar terminal.
  3. fakta bahwa ls -Coutput berbentuk kolom, tetapi dapat dikonfigurasikan ke berbagai jumlah ruang sebagai pemisah bidang.
  4. kemungkinan spasi putih dalam nama file, (tampilan yang tergantung pada lsopsi tampilan tertentu yang dipilih).

Untuk saat ini, mari kita mulai dengan masalah yang lebih mudah, ( yaitu tidak # 4 di atas), seandainya tidak ada spasi putih di nama file . Untuk mencetak kolom # 2, ini berfungsi:

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

Buka gulungan itu:

  • COLUMNS=$COLUMNSmenjamin bahwa panjang kolom yang dimasukkan | tetap konsisten dengan tampilan terminal saat ini. Mengubah ini ke nilai sewenang-wenang juga berfungsi, sehingga COLUMNS=50atau COLUMNS=70 akan menyebabkan ls -Cuntuk mengatur ulang hal-hal sesuai dengan lebar itu.

    Metode lain adalah dengan menggunakan -wsaklar, misalnya :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trmembuat pemisah bidang konsisten: satu tab di antara setiap kolom.

  • cut menampilkan kolom yang diinginkan.


Metode spasi putih tertunda ...
agc

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

ubah jumlah karakter (54) sesuai kebutuhan sehingga Anda hanya mendapatkan data yang Anda inginkan.


2
untuk memperjelas, menggunakan 54-sayatan untuk setiap karakter mulai dari posisi 54; itu tidak berhenti di kolom "yang dikenal manusia"
Jeff Schaller

Itu bukan ide yang buruk..hanya perlu disempurnakan.
prusswan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.