जब "ls" कमांड काम नहीं करता है तो क्या उपयोग करें?


15

मैंने lsकमांड का उपयोग करने की कोशिश की और एक त्रुटि हुई:

bash: /bin/ls: cannot execute binary file

इस आदेश के बजाय मैं क्या उपयोग कर सकता हूं?


शायद आप अपने libc*soया अपनेld-linux*so
बैसिल स्ट्रैनेवविच

31
व्यक्तिगत रूप से, मैं अपने सिस्टम को ठीक करने पर ध्यान केंद्रित करूंगा, जब तक कि यह कुछ निराला विचार प्रयोग न हो।
फहीम मीठा

2
@BasileStarynkevitch इसके बारे में कभी नहीं सुना, लेकिन बिजीबॉक्स आमतौर पर उपलब्ध है और इसमें कदम रखा जा सकता है।
मुरु

8
... एक प्रणाली बचाव सीडी?
फेडरिको पोलोनी

1
इस तरह के मामलों में वास्तविक समस्या का समाधान करने वाला एक प्रश्न सुपरयुजर . com/ questions/ 435988 है । और असामान्य होने से दूर, जैसा कि निहित है, उबंटू लिनक्स परsash उपलब्ध है , फ्रीबीएसडी बंदरगाहों के पेड़ में गोले पैकेज के रूप में, साथ ही साथ अपने लेखक से सीधे सहित अन्य स्थानों पर गोले / सैश
जेडीबीपी

जवाबों:


32

आप इसके बजाय echoया findआदेशों का उपयोग कर सकते हैं ls:

echo *

या:

find -printf "%M\t%u\t%g\t%p\n"

7
मैं उपयोग करता हूँecho -- *
एडवर्ड टॉर्वाल्ड्स

9
@Invoker: यदि आपके पास -nवर्तमान निर्देशिका में एक फ़ाइल है , जो कि एक ध्वज के रूप में व्याख्या की जाएगी, तो कुछ प्रतिध्वनित नहीं होगी।
MvG


1
@Invoker वर्णमाला क्रम मायने रखता है। उस ओनेलाइनर को एक ऐसे मामले के लिए चलाएं जहां इससे फर्क पड़ता है:rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
jlliagre

3
echoसम्मान नहीं लगता है --, प्रति से । तो कैसे या echo -- *किसी से echo "" *बेहतर है, अभी तक बेहतर है echo "The file(s) are:" *?
जी-मैन का कहना है कि 'मोनिका'

24

आप printfइको की जगह कमांड का भी उपयोग कर सकते हैं :

printf '%s\n' *

printfechoइस स्थिति में बेहतर है कि तर्क सूची के अंत को इंगित करने के लिए "डबल डैश" ( ) का सम्मान नहींecho करता है (कुछ प्रणालियों पर, जिसमें उबंटू 14.04 शामिल है जो मैंने इसे पर परीक्षण किया है):--

llama@llama:~$ mkdir -p Misc/unix210948
llama@llama:~$ cd !$
cd Misc/unix210948
llama@llama:~/Misc/unix210948$ touch -- -n
llama@llama:~/Misc/unix210948$ ls
-n
llama@llama:~/Misc/unix210948$ echo *
llama@llama:~/Misc/unix210948$ echo -- *
-- -n
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n

इस स्थिति में, आप वांछित परिणाम प्राप्त नहीं कर सकते हैं echo(क्योंकि फ़ाइल नामक -nविकल्प के रूप में व्याख्या की जाती है, और डबल डैश काम नहीं करता है, इसलिए आपको इसका उपयोग करना होगा printf)।

ध्यान दें कि आपको हमेशा अज्ञात डेटा से निपटने के दौरान ऊपर की तरह एक प्रारूप स्ट्रिंग का उपयोग करना चाहिए printf, अन्यथा आप अप्रत्याशित परिणाम प्राप्त कर सकते हैं (टिप्पणियों में इसे इंगित करने के लिए @ जी-मैन का धन्यवाद!)।

llama@llama:~/Misc/unix210948$ rm ./-n
llama@llama:~/Misc/unix210948$ touch '\n'
llama@llama:~/Misc/unix210948$ ls
\n
llama@llama:~/Misc/unix210948$ printf -- *

llama@llama:~/Misc/unix210948$ printf '%s\n' *
\n

नामक फाइल \nको एक नई लाइन द्वारा व्याख्यायित किया जाता है printf। इससे बचने के लिए, हम printf( %s) के लिए एक स्वरूपण स्ट्रिंग का उपयोग करते हैं और इसे फ़ाइलों के नाम (ग्लोबिंग के माध्यम से विस्तारित, पहले की तरह) पास करते हैं।

यह printf+ प्रारूपण स्ट्रिंग समाधान विभिन्न प्रकार के फ़ाइलनामों को संभाल सकता है (और "छिपी हुई" फ़ाइलों को भी व्यवहार करता है, अर्थात, जो एक साथ शुरू होते हैं ., वही ls):

llama@llama:~/Misc/unix210948$ rm ./*
zsh: sure you want to delete all the files in /home/llama/Misc/unix210948/. [yn]? y
llama@llama:~/Misc/unix210948$ touch -- '-n' '\n' 'name with spaces' '.hidden'
llama@llama:~/Misc/unix210948$ ls
-n  \n  name with spaces
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
\n
name with spaces

यदि आपका printfसमर्थन करता है %q, तो आप उसका उपयोग भी कर सकते हैं ( printf '%q\n' *)। यह रिक्त स्थान, नई सूची आदि से बच जाएगा यदि आपके फ़ाइलनाम में कोई भी अजीब चरित्र हैं। ( यह इंगित करने के लिए चैट में @ muru का धन्यवाद !)


2
अज्ञात डेटा के साथ काम करते समय, आपको हमेशा'%s' ( \nऔर / या किसी अन्य स्थिर पाठ के साथ) का उपयोग करना चाहिए । उदाहरण के लिए, कमांड का प्रयास करें touch '%.0s' foo bar; ls; printf -- *। इसके विपरीत, मैं यह नहीं देखता कि --जब आपको एक '%s\n'प्रारूप स्ट्रिंग की आवश्यकता होती है तो आपको क्यों चाहिए ।
जी-मैन का कहना है कि 'मोनिका'

@ जी-मैन गुड पॉइंट! धन्यवाद, मैंने --प्रारूप स्ट्रिंग के साथ अनावश्यक को नजरअंदाज कर दिया है , और मैंने अपनी पोस्ट को दूसरी चीज को संबोधित करने के लिए संपादित किया है।
डॉर्कनोब

-nफ़ाइल नाम ईमानदारी से नहीं करना चाहिए एक POSIX -2001 + के लिए बिल्कुल भी एक समस्या हो echoSUSv3 सिस्टम पर - echoउपयोगिता है आवश्यक किसी भी विकल्प को स्वीकार नहीं। bashके echoऔर कुछ अन्य यद्यपि विकल्प संभाल करते हैं, लेकिन bashनिर्माण के विकल्प के साथ संकलित किया जा सकता --enable-xpg-echo-defaultइसे सही ढंग से सभी समय का व्यवहार करते हैं बनाने के लिए। हालाँकि, के लिए सही व्यवहार का echoअर्थ है, बैकलैश की व्याख्या हमेशा अपने तर्कों में बच जाती है। इसलिए सी-स्टाइल एस्केप के साथ कोई भी फ़ाइलनाम आउटपुट w / निष्ठा के लिए नहीं लिखा echoजाएगा - इसका अनुवाद करेगा।
मिकसेर

2
कृपया, कृपया, सभी को '-' की सिफारिश करना बंद कर देना चाहिए जब 10 से अधिक वर्षों से यूनिक्स faq यह समझाता है कि "./" बेहतर और अधिक पोर्टेबल है (सभी प्रोग्रामों के साथ काम करता है (कई) जो न तो संभालते हैं -) ')
ओलिवियर दुलक

1
@ ऑलीवरडाक - ऐसा भी नहीं जो हेल [डब्ल्यू / एक कंफर्मेंट हो echo
मिकसर्व

8

आपको शायद fileऔर unameउपयोगिताओं का उपयोग करना चाहिए ताकि यह पता चल सके कि आपके मशीन के साथ क्या चल रहा है। आपकी त्रुटि एक द्विआधारी निष्पादन योग्य का संकेत है जो सिस्टम आर्किटेक्चर के लिए संकलित है जिसके साथ यह असंगत है।

मेरी मशीन पर:

uname -m; file /bin/ls

... प्रिंट ...

x86_64
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=..., stripped

... क्योंकि वहां दुनिया के साथ सब ठीक है। हालाँकि, यहाँ कुछ कमांड sshमेरे डेस्कटॉप के कनेक्शन पर अपने एंड्रॉइड टैबलेट से चलते हैं ...

#first copy android ls to desktop
scp /system/bin/ls "$ssh:arm_ls"

ls               100%  151KB 151.4KB/s   00:00

#next login to desktop and run the following
ssh "$ssh" '
   HOME=./arm_ls
   chmod +x ~
   file ~
   bash -c ~ ||
   rm ~
'

./arm_ls: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped
bash: ./arm_ls: cannot execute binary file: Exec format error

यह एक शानदार उत्तर है जो एक परिदृश्य को कवर करता है और संभावित अंतर्निहित कारण को संबोधित करता है।
प्रणब

गलत ^ ^ क्षमा करें। फाइल की कॉपी और उपयोग क्यों नहीं? सारी होमडायर की बात क्यों? डेस्कटॉप पर scp, उस पर फ़ाइल, और bash ./it?
ओलिवियर दुलक

@OlivierDulac -hmm .. मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं कि आप वास्तव में पूछ रहे हैं। HOME=बात तो मैं सिर्फ क्या कर सकते हैं ~के बजाय समय की एक गुच्छा ./arm_ls सुविधा के लिए -। अभ्यास का पूरा बिंदु यह है कि मैं अपने x86 डेस्कटॉप पर आर्म बाइनरी का उपयोग नहीं कर सकता, और मैं fileयह दिखाना चाहता था कि यह sydtem के नेटिव की तुलना में बहुत भिन्न प्रकार का बाइनरी है - जो शीर्ष पर दिखाया गया है। और इसलिए पूरे क्रॉस-कंपाइल को shpw करने के बजाय, मैंने एक असंगत बाइनरी को खतना करने के लिए चुना, जो मुझे मेरे x86 डिवाइस के लिए मेरे आर्म देव पर उपलब्ध था और परिणाम दिखाने के लिए और bashत्रुटि को कैसे पूरा किया जाए ।
मोकेसर

1
ओह, यह केवल कुछ टाइपिंग को बचाने के लिए था? ठीक है, लेकिन मुझे लगता है कि यह इसे और अधिक भ्रामक बनाता है जितना कि यह होना चाहिए (यह कोडगॉल्फ ^ ^ नहीं है)
ओलिवियर

1
@ ऑलिवरडाक - बेशक यह कोड गोल्ड नहीं है, लेकिन यह सुविधाजनक है, यह बिल्कुल अस्पष्ट नहीं है, और मुझे अंगूठे के टाइपिंग से नफरत है।
मिकसेर्व

5

बैश (या कई अन्य गोले) का उपयोग करके, आप फ़ाइलों को सूचीबद्ध करने के लिए टैब पूरा करने का उपयोग कर सकते हैं:

$ thisisnotacommand ./public_html/<TAB>
acc/              papers/           android/          l/
sdr/              blast             formalcss.html    switch/
busy/             formalcss.tar.gz  others/           together.jpg

3

यदि आप कुछ अधिक चाहते हैं ls -l(फ़ाइल का आकार, अनुमतियाँ, स्वामी, टाइमस्टैम्प, आदि), तो stat -- *सहायक हो सकता है:

$ ls -l
total 8
-rw-rw-r-- 1 ubuntu ubuntu   4 Jun 20 21:50 a.txt
-rw-rw-r-- 1 ubuntu ubuntu 279 Jun 20 21:50 b.txt
$ stat -- *
  File: ‘a.txt’
  Size: 4           Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 787691      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
Access: 2015-06-20 21:50:23.395223851 -0700
Modify: 2015-06-20 21:50:23.395223851 -0700
Change: 2015-06-20 21:50:23.395223851 -0700
 Birth: -
  File: ‘b.txt’
  Size: 279         Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 844130      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
Access: 2015-06-20 21:50:31.763084155 -0700
Modify: 2015-06-20 21:50:51.066758216 -0700
Change: 2015-06-20 21:50:51.066758216 -0700
 Birth: -
$ 

वैकल्पिक रूप से यदि आप सभी को मिसपेल करना चाहते थे ls, तो इसके बजाय प्रयास करेंsl । ;-) (चलें - इसे आज़माएँ ... आपको इसे स्थापित करना पड़ सकता है)


3

कई प्रणालियों पर समान उपयोगिता उपलब्ध है:

dir

जानकारी पृष्ठों के अनुसार यह इसके बराबर है ls -C -b, लेकिन यह स्टैंडअलोन बाइनरी फाइल है।

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

BTW, मुझे लगता है कि इसका नाम विंडोज़ (या बल्कि डॉस) सिस्टम से आता है।


1

उपयोग

 echo -- *
    find . -printf "%M\t%u\t%g\t%p\n"
    ls -C -b
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.