Ls -l có thể được thực hiện để tách các trường bằng các tab chứ không phải là khoảng trắng để làm cho đầu ra hữu ích trong bảng tính không?


10

Làm thế nào đầu ra của ls -lcó thể được sửa đổi thành các trường riêng biệt bằng cách sử dụng các tab thay vì khoảng trắng? Tôi muốn dán đầu ra vào một bảng tính; phần đệm với số lượng không gian thay đổi gây khó khăn cho việc này. Để minh họa:

root root drwxr-xr-x 2 4096 26 tháng 9 11:43 wpa_supplicant
-rw-r ----- 1 gốc quay số 66 tháng 9 26 11:43 wvdial.conf
drwxr-xr-x 9 root root 4096 ngày 8 tháng 10 08:21 X11
drwxr-xr-x 12 root root 4096 18 tháng 2 23:31 xdg
drwxr-xr-x 2 root root 4096 Ngày 31 tháng 1 06:11 xml
gốc rễ drwxr-xr-x 2 4096 22 tháng 11 07:26 xul-ext
-rw-r - r-- 1 root gốc 349 ngày 13 tháng 1 năm 2012 zsh_command_not_found

Trong đoạn trích từ ls -l /etchình trên, hàng 1, 2 và 3 có một chữ số duy nhất trong cột 2 trong khi hàng 4 có hai. Điều đó có nghĩa là sự liên kết đạt được bằng cách sử dụng hai khoảng trắng để tách các cột 1 và 2 trong các hàng 1-3, nhưng chỉ một không gian trong hàng 4.

ls 

Câu trả lời:


3

Tôi đã tạo một kịch bản shell cho cùng. Nó xử lý các trường hợp khi tên tệp có khoảng trắng hoặc bất kỳ ký tự đặc biệt nào khác.

#! / thùng / bash

TIẾT KIỆM = $ IFS
IFS = $ (echo -en "\ n \ b")
cho tệp bằng $ (ls)
làm
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $
    mod_epoch = $ (tệp stat --format = "% Y" $)
    mod_month = $ (ngày -d @ $ mod_epoch + "% b")
    mod_day = $ (ngày -d @ $ mod_epoch + "% d")
    mod_time = $ (ngày -d @ $ mod_epoch + "% H:% M")
    printf "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ file
làm xong
IFS = $ TIẾT KIỆM
  • Lưu nó vào một tập tin, nói ls_tab.sh
  • Làm cho nó thực thi:
chmod + x ls_tab.sh
  • Chạy nó:
./ls_tab.sh

Lưu ý: Điều này có thể được thực hiện bằng cách phân tích đầu ra của ls, tuy nhiên lý do tại sao nó không nên được thực hiện được đưa ra ở đây .


1
Nếu mục tiêu là để biết những gì lsnói , phân tích đầu ra của nó là tốt. Đó hiếm khi là mục tiêu. Có thể cho rằng nó ở đây. Tôi nghĩ rằng phương pháp bạn đã sử dụng là khá tốt (bất kỳ phương pháp nào cũng sẽ tạo ra kết quả không mong muốn với một số nhu cầu)! Tuy nhiên, phân tích cú pháp lscó thể tốt hơn. Hãy xem xét trường hợp của một tên tệp thực sự có một ký tự tab trong đó. ls -lthay thế tab bằng một ?ký tự. Tập lệnh của bạn giữ nguyên ký tự tab, sẽ tạo thêm các cột nếu đầu ra của nó được hiểu là được phân định bằng tab và được sử dụng để tạo bảng tính. Nó xuống cấp nghiêm trọng nếu tên tệp có dòng mới.
Eliah Kagan

1
Thật. Nhưng thông thường các tập tin không có \nhoặc \ttrong tên của họ. Nếu họ làm như vậy, thì việc phân tích cú pháp đầu ra lsbằng các lệnh bash đơn giản sẽ phức tạp hơn, nhưng có thể đạt được. Tôi có thể cập nhật câu trả lời, nếu OP muốn xử lý các trường hợp như vậy.
xanh

Điều này làm việc cho tôi và tên tập tin dài với không gian trong đó hiển thị đúng. Cách sử dụng của tôi khá đơn giản và tôi hy vọng không xử lý các tệp có \n\ttrong tên của chúng.

1
Hoàn hảo. Đối với Windows speadsheet sử dụng printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $filevà để chuyển hướng ouptut tệp như ./ls_tab.sh > listing.txt.
Fedir RYKHTIK

6

Thử:

ls -l | awk -v OFS="\t" '$1=$1'

Hoặc, nếu tên tệp của bạn có khoảng trắng:

ls -l | awk '{print $1,"\t",$2,"\t",$3,"\t",$4,"\t",$5,"\t",$6,"\t",$7,"\t",$8,"\t",$9,$10,$11,$12,$13,$14,$15;}'

+1. Hoạt động hoàn hảo. Loại điều này là chính xác những gì awklà cho. Tài giỏi!
tgies

Thật không may, điều này không hoạt động chính xác cho tên tệp có chứa khoảng trắng. Nó thay thế chúng bằng các tab là tốt. Mặc dù điều này đơn giản hơn và chạy nhanh hơn giải pháp dựa trên tập lệnh của green7 , nhưng điều này sẽ tạo ra đầu ra không chính xác trong một khoảng thời gian lớn và không có lợi thế so với phương pháp của Aditya . Điều này có thể được sửa đổi để không gian không còn được hiểu là dấu phân cách đầu vào, sau cột thứ 9 không?
Eliah Kagan

1
vui lòng xem cập nhật
philshem 26/03/13

@ psny18 Cách cập nhật thậm chí còn bị hỏng nặng hơn. Nó cắt mọi thứ trừ từ đầu tiên của mỗi tên tệp. Viết đơn giản $9không thay đổi thực tế là bạn awkluôn diễn giải các khoảng trắng như biểu thị dấu ngắt giữa các cột. $9chỉ bắt giữ từ đầu tiên ở vị trí đó và vì các từ khác được coi là các cột riêng biệt, được đánh số cao hơn, nên chúng không bao giờ được in.
Eliah Kagan

Thật đáng tiếc khi tên tệp không được coi là một cột ngay cả khi chúng có khoảng trắng trong đó.

1

Chúng tôi thậm chí không cần phải chuyển đổi đầu ra dưới dạng Tab Deliated. Không gian giữa các cột là đủ tốt.

Chạy ls -llệnh của bạn trong terminal như bạn thường làm và sao chép nội dung bạn muốn dán vào Bảng tính.

lệnh đầu cuối

Tiếp theo, hãy mở chương trình Bảng tính của bạn (LibreScript Calc trong trường hợp của tôi) và nhấn Ctrl+ Vđể dán nội dung trong bảng tạm của bạn.

Thuật sĩ Nhập văn bản sẽ bật lên. Hãy chắc chắn rằng bạn đặt một dấu kiểm bên cạnh Spacevà nhấn Ok. Bạn có thể xem bản xem trước trong khung bên dưới.

Nhập văn bản Libo


1
Điều này sẽ không hoạt động khi tên tệp có khoảng trắng
màu xanh lá cây

@ green7: Ah .. Không nhận ra điều đó! :-)
Aditya

Không chỉ tên tập tin mà cả số lượng ký tự trong các cột. Việc đệm ở đó và các nơi khác gây ra vấn đề nếu "không gian" được chọn làm dấu phân cách. Tôi sẽ chỉnh sửa câu hỏi để minh họa điều đó.

0

trăn là tốt cho việc này:

# python
import os

os.system( 'ls -lR --time-style=full-iso /home/jw > ls_dump.txt')

folder = ''

for line in open('ls_dump.txt', 'r'):

    inrec = line.split()

    if inrec == []:
        continue

    if inrec[0].startswith('total'):
        continue

    if inrec[0].endswith(':'):
        folder = inrec[0].replace(':','')
        continue

    outline = folder + '\t' + '\t'.join(inrec[0:8]) +'\t'+ ' '.join(inrec[8:]) 

    print( outline )
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.