मैं लिनक्स में आउटपुट लाइन प्रति एक फ़ाइल नाम कैसे सूचीबद्ध करूं?


229

मैं ls -aएक निर्देशिका में फ़ाइल नाम प्राप्त करने के लिए कमांड का उपयोग कर रहा हूं , लेकिन आउटपुट एक पंक्ति में है।

ऐशे ही:

.  ..  .bash_history  .ssh  updater_error_log.txt

मुझे फ़ाइल नाम प्राप्त करने के लिए एक बिल्ट-इन विकल्प की आवश्यकता है, प्रत्येक एक नई लाइन पर, इस तरह:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

3
ls का उद्देश्य मानव उपभोग के लिए एक सूची प्रदर्शित करना है। यदि आप किसी अन्य उद्देश्य के लिए ls का उपयोग कर रहे हैं (जैसे, कहते हैं, किसी स्क्रिप्ट में फ़ाइलों की सूची को पुनरावृत्त करने के लिए), तो आप निश्चित रूप से गलत टूल का उपयोग कर रहे हैं।
पीटर

2
@ जुलियानो - इसका वास्तव में एक अजगर लिपि द्वारा सेवन किया जाना है। आप इसे गलत उपकरण क्यों कहते हैं?
फिक्सडियर

1
@fixxer आप जिस समय lsअजगर को पाइप करते हैं, lsवह प्रति पंक्ति एक फाइल आउटपुट करेगा जैसा कि मैंने अपने उत्तर में बताया था।
पीटर जी।

6
@fixxxer: तब आप वास्तव में गलत तरीके से इसका उपयोग कर रहे हैं। यह उपयोगकर्ता टर्मिनल में आउटपुट के लिए लिस्टिंग को प्रारूपित करता है। यह फ़ाइल नाम में विशेष वर्णों को प्रतिस्थापित कर सकता है, यह उन वर्णों को छोड़ सकता है जिनके विशेष अर्थ हैं, आदि ... दूसरे शब्दों में, ls उपयोगकर्ता के लिए एक सूची को प्रारूपित करता है। आप अनफ़िल्टर्ड फ़ाइलनाम चाहते हैं। कोई विशेष कारण जो आप अजगर 'ग्लोब' मॉड्यूल का उपयोग नहीं कर रहे हैं? docs.python.org/library/glob.html 'fnmatch', 'dircache' और अन्य भी हैं।
पीटर

@fixxer आप वास्तव में किया जाता है lsकरने के लिए उत्पादन के लिए pythonऔर अजगर में एकल लाइन उत्पादन मनाया?
पीटर जी।

जवाबों:


430

-1विकल्प का उपयोग करें (ध्यान दें कि यह "एक" अंक है, निचला अक्षर "L" नहीं), इस तरह:

ls -1a

पहले, हालांकि, सुनिश्चित करें कि आपके lsसमर्थन -1। जीएनयू कोर्यूटिल्स (मानक लिनक्स सिस्टम पर स्थापित) और सोलारिस करते हैं; लेकिन संदेह में हैं, का उपयोग करें man lsया ls --helpया दस्तावेज की जाँच करें। उदाहरण के लिए:

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

2
+1, मुझे -1 के बारे में नहीं पता था (-एल हाँ (एक नहीं)) यह मैन-पेज में
दिखता है,

@ सलश्मिस - आह, अच्छा बिंदु - गलती करने के लिए आसान। मैंने जवाब में स्पष्ट किया।
बर्ट एफ

1
@ डर्टी: जीएनयू के लिए, आपको यह डॉक्यूमेंटेड ls --helpआउटपुट में मिलता है ... हमेशा इंस्टॉल ;-)
टोनी डेलारॉय

3
के लिए Google पर खोज की गई linux ls one file per lineऔर यह शीर्ष लेख था। विश्वास नहीं कर सकते हैं कि चुना गया उत्तर कितना चिंताजनक है या यह कि उस बिल्ली के पास पाइप की तुलना में कम वोट हैं। ls -1FTW।
crantok

3
ls-1व्यवहार से चूक जब आउटपुट टर्मिनल से जुड़ा नहीं है।
कोडफोर्स्टर

131

हां, आप lsप्रति पंक्ति एक आउटपुट नाम आसानी से बना सकते हैं :

ls -a | cat

स्पष्टीकरण: कमांड को lsहोश आता है जब आउटपुट टर्मिनल या फ़ाइल या पाइप पर होता है और तदनुसार समायोजित होता है।

इसलिए, यदि आप ls -aअजगर को पाइप करते हैं , तो यह बिना किसी विशेष उपाय के काम करना चाहिए।


2
वाह, यह शानदार है। स्वीकृत उत्तर पर लाभ - यह वास्तव में एंड्रॉइड / एडीबी शेल पर काम करता है - जहां lsबस कुछ छीन लिया गया संस्करण है, इसलिए समर्थन नहीं करता है-1
mkilmanas

कैसे आप बच जाएंगे .और .."फ़ाइलें" हालांकि उत्पादन में दिखा रहा है?
Matanster

@matanster: यह निर्भर करता है, क्या आप डॉट-फाइल्स बिल्कुल देखना चाहते हैं? यदि नहीं, तो केवल -a विकल्प छोड़ें।
पीटर जी।

29

Ls को मानव उपभोग के लिए डिज़ाइन किया गया है, और आपको इसके आउटपुट को पार्स नहीं करना चाहिए

शेल स्क्रिप्ट में, कुछ मामले हैं जहां एलएस के उत्पादन को पार्स करने से काम होता है, वांछित प्रभाव को प्राप्त करने का सबसे सरल तरीका है। चूंकि ls गैर-ASCII को नियंत्रित कर सकते हैं और फ़ाइल नामों में वर्णों को नियंत्रित कर सकते हैं, इसलिए ये मामले उन लोगों का सबसेट हैं जिन्हें फ़ाइल नाम प्राप्त करने की आवश्यकता नहीं है ls

अजगर में, पूरी तरह से आह्वान करने का कोई कारण नहीं है ls। पायथन में lsअंतर्निहित कार्यक्षमता सभी है। का प्रयोग करें os.listdirएक निर्देशिका की सामग्री को सूचीबद्ध करने और os.statया osफ़ाइल मेटाडाटा प्राप्त करने के लिए। osमॉड्यूल में अन्य कार्यों के रूप में अच्छी तरह से अपनी समस्या के लिए प्रासंगिक होने की संभावना है।


यदि आप ssh पर दूरस्थ फ़ाइलों तक पहुँच रहे हैं, तो फ़ाइल नामों को सूचीबद्ध करने का एक बहुत ही मजबूत तरीका sftp है।

echo ls -1 | sftp remote-site:dir

यह प्रति पंक्ति एक फ़ाइल नाम प्रिंट करता है, और lsउपयोगिता के विपरीत , sftpगैर-अक्षर वर्णों को नियंत्रित नहीं करता है। आप अभी भी विश्वसनीय रूप से उन निर्देशिकाओं को सूचीबद्ध करने में सक्षम नहीं होंगे जहां एक फ़ाइल नाम में एक नई पंक्ति होती है, लेकिन ऐसा शायद ही कभी किया जाता है (इसे एक संभावित सुरक्षा समस्या के रूप में याद रखें, प्रयोज्य मुद्दा नहीं)।

अजगर में (सावधान रहें कि शेल मेटाचैकर को बचना चाहिए remote_dir):

command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")

अधिक जटिल इंटरैक्शन के लिए, प्रलेखन में sftp के बैच मोड को देखें।

कुछ प्रणालियों (लिनक्स, मैक ओएस एक्स, शायद कुछ अन्य यूनियनों पर, लेकिन निश्चित रूप से विंडोज नहीं), एक अलग दृष्टिकोण है sshfs के साथ ssh के माध्यम से एक दूरस्थ फाइल सिस्टम को माउंट करना , और फिर स्थानीय रूप से काम करना।


मैं SSH के माध्यम से दूरस्थ मशीन से जुड़ा हुआ हूं। मुझे एक लाइन में रिमोट मशीन पर os.listdir जैसे अजगर फ़ंक्शन को निष्पादित करने का कोई तरीका नहीं मिला। इसलिए, यह सवाल है। मैं केवल फाइलों को सूचीबद्ध करने के लिए स्क्रिप्ट लिखना नहीं चाहता। क्या इस समस्या का कोई तरीका है?
फिक्सएक्सियर

@fixxxer: ssh स्थिति को बदलता है, यह उन चीज़ों की तरह है जिनका आपको अपने मूल प्रश्न में उल्लेख करना चाहिए था! मुझे लगता है कि आपके उपयोग के मामले के लिए sftp उपयुक्त है।
गाइल्स का SO- बुराई पर रोक '23

मैं भ्रम के लिए माफी चाहता हूँ। क्या कोई तरीका है जो मैं "कमांड_लाइन" में भी पासवर्ड डाल सकता हूं?
fixxxer

@fixxxer: मुझे नहीं पता, ssh के लेखक सादे पाठ में संग्रहीत पासवर्डों पर लिखते हैं और इसे आसान नहीं बनाते हैं। आपको वास्तव में कुंजी-आधारित प्रमाणीकरण सेट करना चाहिए (वेब ​​पर बहुत सारे ट्यूटोरियल हैं और इस बारे में superuser.com पर प्रश्न हैं )।
गाइल्स का SO- बुराई होना बंद हो '

11

आप उपयोग कर सकते हैं ls -1

ls -l काम भी करेंगे


शीर्ष उत्तर में पहले से ही आपके द्वारा कही गई सटीक बातों का उल्लेख है। यह भी प्रश्न विशेष रूप से कहता है ls -lकि इसका उपयोग नहीं किया जाना चाहिए।
DevX

2

जब तक आपके फ़ाइलनाम में नई सूचियाँ शामिल नहीं हैं, तब तक आसान:

find . -maxdepth 1

यदि आप इसे किसी अन्य कमांड में पाइप कर रहे हैं, तो आपको संभवत: अपने ब्यूटेन को बाइट्स द्वारा अलग-अलग करना पसंद करना चाहिए, न कि न्यूलाइन के बजाय, क्योंकि न्यूड बाइट एक फ़ाइल नाम में नहीं हो सकता (लेकिन न्यूलाइन हो सकता है):

find . -maxdepth 1 -print0

एक टर्मिनल पर छपाई शायद एक लाइन के रूप में प्रदर्शित होगी, क्योंकि नल बाइट्स सामान्य रूप से मुद्रित नहीं होते हैं। कुछ कार्यक्रमों में इस तरह के रूप संभाल अशक्त-सीमांकित इनपुट करने के लिए कोई विशिष्ट विकल्प, आवश्यकता हो सकती है sortके -z। इसी तरह आपकी खुद की स्क्रिप्ट को भी ध्यान में रखना होगा।

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