จะใช้อะไรเมื่อคำสั่ง“ ls” ไม่ทำงาน


15

ฉันพยายามใช้lsคำสั่งและได้รับข้อผิดพลาด:

bash: /bin/ls: cannot execute binary file

ฉันจะใช้อะไรแทนคำสั่งนี้


บางทีคุณอาจเมาlibc*soหรือของคุณld-linux*so
Basile Starynkevitch

31
โดยส่วนตัวแล้วฉันจะมุ่งเน้นที่การแก้ไขระบบของฉันเว้นแต่ว่านี่เป็นการทดลองที่คิดแปลก ๆ
Faheem Mitha

2
@BasileStarynkevitch ไม่เคยได้ยินมาก่อน แต่ Busybox นั้นมีอยู่ทั่วไปและสามารถก้าวเข้ามาได้
muru

8
... ซีดีกู้ระบบหรือไม่
Federico Poloni

1
คำถามที่อยู่ในปัญหาที่เกิดขึ้นจริงในกรณีดังกล่าวเป็นsuperuser.com/questions/435988 และห่างไกลจากความผิดปกติเป็นนัย ๆsashสามารถใช้ได้บน Ubuntu Linuxเป็นเปลือกหอย / สายสะพายในต้นไม้ FreeBSD พอร์ตเป็นแพคเกจ Gentooเช่นเดียวกับสถานที่อื่น ๆ รวมทั้งโดยตรงจากผู้เขียน
JdeBP

คำตอบ:


32

คุณสามารถใช้echoหรือfindคำสั่งแทนls :

echo *

หรือ:

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

7
ฉันจะใช้echo -- *
Edward Torvalds

9
@Invoker: หากคุณมีไฟล์ที่เรียกว่า-nในไดเรกทอรีปัจจุบันที่จะได้รับการตีความว่าเป็นธงไม่ใช่สิ่งที่จะสะท้อน
MvG

2
มันจะเป็นtouch ./-n
Basile Starynkevitch

1
@Invoker ลำดับตัวอักษรมีความสำคัญ เรียก oneliner ว่าสำหรับกรณีที่ที่ทำให้ความแตกต่าง:rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
jlliagre

3
echoดูเหมือนจะไม่ให้เกียรติ--, ต่อ se ดังนั้นจะecho -- *ดีกว่าecho "" *หรือยังดีกว่าecho "The file(s) are:" *อย่างไร
G-Man กล่าวว่า 'Reinstate Monica'

24

คุณยังสามารถใช้printfคำสั่งแทน echo:

printf '%s\n' *

printfจะดีกว่าechoในสถานการณ์เช่นนี้ในการที่echoจะไม่เคารพ "ประคู่" ( --) ที่มีความหมายท้ายของรายการอาร์กิวเมนต์ (ในบางระบบรวมทั้ง Ubuntu 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เนื่องจากมิฉะนั้นคุณจะได้รับผลที่ไม่คาดคิด (ขอบคุณ @ G-Man สำหรับการชี้ออกมานี้ในความคิดเห็น!):

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โซลูชันสตริงการจัดรูปแบบ + นี้สามารถจัดการชื่อไฟล์ที่หลากหลาย (และยังถือว่าไฟล์ "ซ่อน" ซึ่งก็คือไฟล์ที่ขึ้นต้นด้วย a .เหมือนกับที่มี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'สตริงรูปแบบ
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man จุดที่ดี! ขอบคุณฉันมองข้ามความไม่จำเป็น--กับสตริงรูปแบบและฉันได้แก้ไขโพสต์ของฉันเพื่อแก้ไขสิ่งอื่น
Doorknob

-nชื่อไฟล์ตรงไปตรงมาไม่ควรจะมีปัญหาเลยสำหรับที่ POSIX-2001 + echo- ในระบบ SUSv3 echoยูทิลิตี้จะต้องไม่ยอมรับตัวเลือกใด ๆ bash's echoและอื่น ๆ บางคนทำจัดการตัวเลือกแม้ว่า แต่bashสามารถรวบรวมกับการสร้างตัวเลือก--enable-xpg-echo-defaultที่จะทำให้มันมีลักษณะการทำงานอย่างถูกต้องตลอดเวลา ที่ถูกต้องพฤติกรรมechoแต่หมายถึงเสมอตีความหนีฟันเฟืองในการขัดแย้งของ ดังนั้นชื่อไฟล์ใด ๆ ที่มีการหลบหลีกแบบ C จะไม่ถูกเขียนลงในเอาต์พุตด้วยความถูกต้อง - echoจะแปลมัน
mikeserv

2
ได้โปรดได้โปรดทุกคนควรหยุดแนะนำ '-' เมื่อยูนิกซ์คำถามที่พบบ่อยตั้งแต่ 10 ปีขึ้นไปอธิบายว่าการใช้ "./" นั้นดีกว่าและพกพาได้มากกว่า (ใช้งานได้กับทุกโปรแกรม ')
Olivier Dulac

1
@OliverDulac - ไม่ได้ที่จะ hel [w / echoสอดคล้อง
mikeserv

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

... เพราะถูกต้องกับโลกที่นั่น อย่างไรก็ตามนี่เป็นคำสั่งบางส่วนที่เรียกใช้จากแท็บเล็ต Android ของฉันในการ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

นี่เป็นคำตอบที่ดีที่ครอบคลุมสถานการณ์หนึ่งและระบุถึงสาเหตุที่เป็นไปได้
Pranab

ผิดพลาด ^^ ขอโทษ ทำไมไม่คัดลอกและใช้ไฟล์? ทำไมสิ่งที่ homedir ทั้งหมด? scp ไปยังเดสก์ท็อป, ไฟล์บน, และ bash ./it?
Olivier Dulac

@OlivierDulac - อืมมม .. ฉันไม่แน่ใจว่าฉันได้รับส่วนสำคัญของสิ่งที่คุณถามอย่างแน่นอน HOME=สิ่งที่เป็นดังนั้นฉันก็สามารถทำ~พวงของครั้งแทน./arm_ls - เพื่อความสะดวกสบาย จุดทั้งหมดของแบบฝึกหัดคือฉันไม่สามารถใช้แขนไบนารีบนเดสก์ท็อป x86 ของฉันและฉันต้องการให้ผลลัพธ์ของfileมันแสดงให้เห็นว่ามันเป็นไบนารีที่แตกต่างกันมากกว่าแบบดั้งเดิมของ sydtem - ซึ่งจะแสดงที่ด้านบน ดังนั้นแทนที่จะรวบรวมข้ามทั้งหมดฉันเลือก cpy ไบนารีที่เข้ากันไม่ได้ฉันมีให้ฉันที่แขนของฉันไปยังอุปกรณ์ x86 ของฉันและแสดงผลลัพธ์และวิธีการหาbashข้อผิดพลาด
mikeserv

1
โอ้มันเป็นเพียงการบันทึกการพิมพ์ไม่กี่? ตกลง แต่ฉันคิดว่ามันทำให้สับสนมากกว่าที่ควรจะเป็น (ไม่ใช่ codegolf ^^)
Olivier Dulac

1
@OliverDulac - แน่นอนว่าไม่ใช่รหัสทอง แต่ก็สะดวกมันไม่ได้คลุมเครือเลยและฉันเกลียดการพิมพ์ด้วยนิ้วโป้ง
mikeserv

5

การใช้ bash (หรือเชลล์อื่น ๆ จำนวนมาก) คุณสามารถใช้การเติมเต็มของแท็บเพื่อแสดงไฟล์:

$ 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 ฉันเดาชื่อมาจากระบบ windows (หรือมากกว่า dos)


1

ใช้

 echo -- *
    find . -printf "%M\t%u\t%g\t%p\n"
    ls -C -b
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.