क्या ls -l को स्प्रेडशीट में आउटपुट उपयोगी बनाने के लिए रिक्त स्थान के बजाय टैब के साथ अलग क्षेत्रों में बनाया जा सकता है?


10

ls -lरिक्त स्थान के बजाय टैब का उपयोग करके अलग-अलग फ़ील्ड में कैसे संशोधित किया जा सकता है? मैं आउटपुट को एक स्प्रेडशीट में पेस्ट करना चाहता हूं; रिक्त स्थान की एक चर संख्या के साथ पैडिंग ऐसा करना मुश्किल बनाता है। उदाहरण देकर स्पष्ट करने के लिए:

drwxr-xr-x 2 रूट रूट 4096 सितंबर 26 11:43 wpa_supplicant
-rw-r ----- 1 रूट डायलआउट 66 सितंबर 26 11:43 wvdial.conf
drwxr-xr-x 9 रूट रूट 4096 अक्टूबर 8 08:21 X11
drwxr-xr-x 12 रूट रूट 4096 फरवरी 18 23:31 xdg
drwxr-xr-x 2 रूट रूट 4096 जनवरी 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 / bash

SAVEIFS = $ आईएफएस
IFS = $ (गूंज "\ n \ b")
$ (ls) में फ़ाइल के लिए
करना
    stat --printf = "% A \ t% h \ t% U \ t% G \ t% s \ t" $ फ़ाइल
    mod_epoch = $ (स्टेट -फॉर्मैट = "% Y" $ फ़ाइल)
    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एक ?चरित्र के साथ टैब को बदलता है । आपकी स्क्रिप्ट टैब वर्ण को संरक्षित करती है, जो अतिरिक्त कॉलम बनाएगी यदि इसके आउटपुट को टैब-डेलिमिटेड के रूप में समझा जाए और स्प्रेडशीट बनाने के लिए उपयोग किया जाए। यह बुरी तरह से अपमानित करता है यदि फ़ाइल नाम में एक नई रेखा है।
एलिया कगन

1
सच। लेकिन आम तौर पर फाइलों में \nया \tउनके नाम नहीं होते हैं। यदि वे करते हैं, तो lsसरल बैश कमांड के आउटपुट को पार्स करना अधिक जटिल होगा, लेकिन प्राप्त किया जा सकता है। मैं जवाब अपडेट कर सकता हूं, अगर ओपी ऐसे मामलों को संभालना चाहता है।
हरा

यह मेरे और लंबे फ़ाइलनामों के लिए काम करता है जिसमें रिक्त स्थान ठीक से प्रदर्शित होते हैं। मेरा उपयोग काफी सरल है और मुझे उम्मीद है कि फाइलों के साथ \nऔर \tउनके नामों से निपटने के लिए नहीं ।

1
उत्तम। विंडोज स्पाइसशीट के उपयोग के लिए printf "%s\t%s\t%s\t%s\r\n" $mod_month $mod_day $mod_time $fileऔर फ़ाइल को ouptut के रूप में पुनर्निर्देशित करना ./ls_tab.sh > listing.txt
फेडिर 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

दुर्भाग्य से यह फ़ाइल नाम के लिए सही ढंग से काम नहीं करता है जिसमें रिक्त स्थान होते हैं। यह उन्हें टैब के साथ भी बदलता है। हालांकि यह सरल है और ग्रीन 7 के स्क्रिप्ट आधारित समाधान की तुलना में तेजी से चलता है , यह गलत आउटपुट को बड़ी मात्रा में उत्पन्न करेगा, और आदित्य की विधि पर कोई लाभ नहीं है । क्या इसे संशोधित किया जा सकता है ताकि रिक्त स्थान को 9 वें कॉलम के बाद इनपुट डेलिमेटर्स के रूप में व्याख्या नहीं किया जा सके?
एलियाह कगन

1
कृपया देखें अपडेट
philshem

@ psny18 अद्यतन तरीका और भी बुरी तरह से टूट गया है। यह सब कुछ काट देता है लेकिन प्रत्येक फ़ाइलनाम का पहला शब्द। बस लेखन $9इस तथ्य को नहीं बदलता है कि आपके पास awkस्तंभों के बीच एक ब्रेक के संकेत के रूप में हमेशा रिक्त स्थान की व्याख्या है। $9उस स्थिति में केवल पहला शब्द कैप्चर करता है, और चूंकि अन्य शब्दों को अलग, उच्च-संख्या वाले कॉलम माना जाता है, वे कभी भी मुद्रित नहीं होते हैं।
एलियाह कगन

यह अफ़सोस की बात है कि फ़ाइलनामों को एक कॉलम के रूप में नहीं माना जाता है, भले ही उनमें रिक्त स्थान हों।

1

हमें टैब डिलेप्टेड के रूप में आउटपुट को बदलने की भी आवश्यकता नहीं है। स्तंभों के बीच का स्थान पर्याप्त ठीक है।

अपने ls -lआदेश को टर्मिनल में चलाएं जैसा कि आप सामान्य रूप से करते हैं और उन सामग्रियों की प्रतिलिपि बनाते हैं जिन्हें आप स्प्रेडशीट में चिपकाना चाहते हैं।

टर्मिनल कमांड

इसके बाद, अपना स्प्रैडशीट प्रोग्राम खोलें (मेरे मामले में लिब्रे ऑफिस Calc) और अपने क्लिपबोर्ड की सामग्री को पेस्ट करने के लिए Ctrl+ दबाएँ V

पाठ आयात विज़ार्ड पॉप अप होगा। सुनिश्चित करें कि आपने बगल में एक चेकमार्क लगाया है Spaceऔर दबाएं Ok। आप निचले फलक में पूर्वावलोकन देख सकते हैं।

लिबो पाठ आयात


1
यह तब काम नहीं करेगा जब फ़ाइलनाम में रिक्त स्थान हों
हरे रंग की

@ ग्रीन 7: आह .. यह एहसास नहीं था! :-)
आदित्य

न केवल फ़ाइल नाम, बल्कि कॉलम में वर्णों की संख्या भी। वहां और अन्य जगहों पर पैडिंग करने से समस्याएं पैदा होती हैं यदि "स्पेस" को सीमांकक के रूप में चुना जाता है। मैं उस प्रश्न का वर्णन करने के लिए संपादन करूँगा।

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 )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.