สามารถสร้าง ls -l เพื่อแยกฟิลด์ด้วยแท็บแทนที่จะเว้นวรรคเพื่อให้เอาต์พุตมีประโยชน์ในสเปรดชีตได้หรือไม่


10

เอาต์พุตของls -lสามารถแก้ไขเพื่อแยกฟิลด์โดยใช้แท็บแทนการเว้นวรรคได้อย่างไร ฉันต้องการวางผลลัพธ์ลงในสเปรดชีต การเติมช่องว่างด้วยจำนวนตัวแปรทำให้การทำเช่นนั้นยาก เพื่อแสดง:

drwxr-xr-x 2 รูทราก 4096 26 ก.ย. 11:43 wpa_supplicant
-rw-r ----- 1 dialout dialout 66 Sep 26 11:43 wvdial.conf
drwxr-xr-x 9 รูทราก 4096 8 ต.ค. 08:21 X11
drwxr-xr-x 12 root root 4096 Feb 18 23:31 xdg
drwxr-xr-x 2 root root 4096 Jan 31 06:11 xml
drwxr-xr-x 2 รูทราก 4096 22 พ.ย. 07:26 xul-ext
-rw-r - r-- 1 รูทราก 349 ม.ค. 13 2012 zsh_command_not_found

ในข้อความที่ตัดตอนมาจากls -l /etcด้านบนแถว 1, 2 และ 3 มีตัวเลขหลักเดียวในคอลัมน์ 2 ในขณะที่แถว 4 มีสอง นั่นหมายถึงการจัดตำแหน่งทำได้โดยใช้ช่องว่างสองช่องสำหรับการแยกคอลัมน์ 1 และ 2 ในแถว 1-3 แต่เพียงหนึ่งช่องว่างในแถว 4

ls 

คำตอบ:


3

ฉันทำเชลล์สคริปต์สำหรับสิ่งเดียวกัน ดูแลกรณีเมื่อชื่อไฟล์มีช่องว่างหรืออักขระพิเศษอื่น ๆ

#! / bin / ทุบตี

SAVEIFS = $ ไอเอฟเอ
IFS = $ (echo -en "\ n \ b")
สำหรับไฟล์เป็น $ (ls)
ทำ
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ ไฟล์
    mod_epoch = $ (stat --format = "% Y" $ file)
    mod_month = $ (วันที่ -d @ $ mod_epoch + "% b")
    mod_day = $ (วันที่ -d @ $ mod_epoch + "% d")
    mod_time = $ (วันที่ -d @ $ mod_epoch + "% H:% M")
    พิมพ์ "% s \ t% s \ t% s \ t% s \ n" $ mod_month $ mod_day $ mod_time $ ไฟล์
เสร็จแล้ว
ไอเอฟเอ = $ SAVEIFS
  • บันทึกลงในไฟล์พูด ls_tab.sh
  • ทำให้ปฏิบัติการ:
chmod + x ls_tab.sh
  • เรียกใช้:
./ls_tab.sh

หมายเหตุ:ซึ่งสามารถทำได้โดยการแยกการส่งออกของlsแต่เหตุผลที่ว่าทำไมมันไม่ควรทำจะได้รับที่นี่


1
ถ้าเป้าหมายคือการรู้ว่าสิ่งที่lsบอกว่าแยกผลผลิตของตนดี นั่นคือเป้าหมายที่ไม่ค่อย มันอยู่ที่นี่อย่างแน่นอน ผมคิดว่าวิธีการที่คุณเคยใช้ค่อนข้างดี (วิธีการใด ๆ ที่จะก่อให้เกิดผลที่ไม่พึงประสงค์ได้รับบางชุดของความต้องการ)! อย่างไรก็ตามการแยกวิเคราะห์เนื้อหาlsอาจจะดีกว่า พิจารณากรณีของชื่อไฟล์ที่มีอักขระแท็บอยู่จริง ls -lแทนที่แท็บด้วย?อักขระ สคริปต์ของคุณรักษาอักขระแท็บไว้ซึ่งจะสร้างคอลัมน์เพิ่มเติมหากเอาท์พุทมันถูกตีความว่าเป็นการลบแท็บและใช้ในการสร้างสเปรดชีต มันลดระดับลงอย่างรุนแรงหากชื่อไฟล์มีการขึ้นบรรทัดใหม่
Eliah Kagan

1
จริง แต่โดยปกติไฟล์จะไม่มี\nหรือ\tอยู่ในชื่อ หากพวกเขาทำเช่นนั้นแล้วแยกวิเคราะห์ผลลัพธ์lsด้วยคำสั่งทุบตีง่ายจะมีความซับซ้อนมากขึ้น แต่สามารถทำได้ ฉันสามารถอัปเดตคำตอบหาก OP ต้องการจัดการกับกรณีดังกล่าว
สีเขียว

สิ่งนี้ใช้ได้กับฉันและชื่อไฟล์แบบยาวที่มีช่องว่างในนั้นแสดงอย่างถูกต้อง การใช้งานของฉันค่อนข้างง่ายและฉันหวังว่าจะไม่จัดการกับไฟล์ด้วย\nและ\tในชื่อของพวกเขา

1
สมบูรณ์ สำหรับ Windows speadsheet ใช้printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $fileและเปลี่ยนเส้นทาง ouptut ./ls_tab.sh > listing.txtแฟ้มเป็น
Fedir RYKHTIK

6

ลอง:

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

หรือถ้าชื่อไฟล์ของคุณมีช่องว่าง:

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 ทำงานได้อย่างสมบูรณ์แบบ สิ่งนี้เป็นสิ่งที่awkถูกต้อง ฉลาด!
tgies

น่าเสียดายนี่ทำงานไม่ถูกต้องสำหรับชื่อไฟล์ที่มีช่องว่าง มันจะแทนที่ด้วยแท็บเช่นกัน ขณะนี้เป็นที่เรียบง่ายและทำงานได้เร็วขึ้นกว่าการแก้ปัญหาตามสคริปต์ของ green7นี้จะผลิตออกไม่ถูกต้องจำนวนมากของเวลาและมีข้อได้เปรียบมากกว่าไม่มีวิธี Aditya ของ สิ่งนี้สามารถแก้ไขได้หรือไม่เพื่อไม่ให้มีการตีความช่องว่างเป็นเดลิมิเตอร์อินพุตหลังจากคอลัมน์ที่ 9?
Eliah Kagan

1
โปรดดูการอัปเดต
philshem

@ psny18 วิธีการปรับปรุงจะยิ่งแย่ลงไปอีก มันตัดทุกอย่างออก แต่คำแรกของชื่อไฟล์แต่ละชื่อ การเขียนเพียงอย่าง$9เดียวไม่ได้เปลี่ยนความจริงที่ว่าคุณมีawkการตีความช่องว่างเสมอตามที่ระบุการแบ่งระหว่างคอลัมน์ $9รวบรวมเฉพาะคำแรกในตำแหน่งนั้นและเนื่องจากคำอื่น ๆ ถือว่าเป็นคอลัมน์ที่แยกกันและมีหมายเลขสูงกว่าจึงไม่พิมพ์เลย
Eliah Kagan

น่าเสียดายที่ชื่อไฟล์จะไม่ถือว่าเป็นหนึ่งคอลัมน์แม้ว่าจะมีช่องว่างอยู่ก็ตาม

1

เราไม่จำเป็นต้องแปลงผลลัพธ์เป็น Tab Delimited ช่องว่างระหว่างคอลัมน์ดีพอ

เรียกใช้ls -lคำสั่งของคุณในเทอร์มินัลตามปกติและคัดลอกเนื้อหาที่คุณต้องการวางในสเปรดชีต

คำสั่ง terminal

จากนั้นเปิดโปรแกรมสเปรดชีตของคุณ (LibreOffice Calc ในกรณีของฉัน) แล้วกดCtrl+ Vเพื่อวางเนื้อหาของคลิปบอร์ดของคุณ

ตัวช่วยสร้างการนำเข้าข้อความจะปรากฏขึ้น ตรวจสอบให้แน่ใจว่าคุณใส่เครื่องหมายถูกข้างและกดSpace Okคุณสามารถดูตัวอย่างในบานหน้าต่างด้านล่าง

การนำเข้าข้อความ Libo


1
สิ่งนี้จะไม่ทำงานเมื่อชื่อไฟล์มีช่องว่าง
สีเขียว

@ green7: อ่า .. ไม่รู้ด้วยซ้ำ! :-)
Aditya

ไม่ใช่แค่ชื่อไฟล์ แต่ยังรวมถึงจำนวนตัวอักษรในคอลัมน์ การขยายที่นั่นและที่อื่น ๆ ทำให้เกิดปัญหาหากเลือก "ช่องว่าง" เป็นตัวคั่น ฉันจะแก้ไขคำถามเพื่ออธิบายว่า

0

หลามดีสำหรับสิ่งนี้:

# 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 )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.