Sử dụng gì khi lệnh của lsvs không hoạt động?


15

Tôi đã thử sử dụng lslệnh và gặp lỗi:

bash: /bin/ls: cannot execute binary file

Tôi có thể sử dụng gì thay vì lệnh này?


Có lẽ bạn đã làm libc*sohỏng hoặc của bạnld-linux*so
Basile Starynkevitch

31
Cá nhân, tôi sẽ tập trung vào việc sửa chữa hệ thống của mình, trừ khi đây là một thử nghiệm kỳ quặc.
Faheem Mitha

2
@BasileStarynkevitch chưa bao giờ nghe về nó, nhưng Busybox thường có sẵn và có thể bước vào.
muru

8
... một hệ thống cứu cd?
Federico Poloni

1
Một câu hỏi giải quyết vấn đề thực tế trong những trường hợp như vậy là superuser.com/questions/435988 . Và không có gì lạ, như ngụ ý, sashcó sẵn trên Ubuntu Linux , dưới dạng shell / sash trong cây cổng FreeBSD, dưới dạng gói Gentoo , cũng như các nơi khác, kể cả trực tiếp từ tác giả của nó .
JdeBP

Câu trả lời:


32

Bạn có thể sử dụng các lệnh echohoặc findthay vì ls:

echo *

hoặc là:

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

7
Tôi sẽ sử dụngecho -- *
Edward Torvalds

9
@Invoker: Nếu bạn có một tệp được gọi -ntrong thư mục hiện tại, nó sẽ được hiểu là một cờ, không phải là thứ gì đó để lặp lại.
MvG

2
Nó sẽ làtouch ./-n
Basile Starynkevitch

1
@Invoker Thứ tự chữ cái có vấn đề. Chạy oneliner đó cho một trường hợp tạo ra sự khác biệt:rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
jlliagre

3
echodường như không đến danh dự --, cho mỗi gia nhập . Vì vậy, làm thế nào là echo -- *tốt hơn echo "" *hoặc, tốt hơn , echo "The file(s) are:" *?
G-Man nói 'Phục hồi Monica'

24

Bạn cũng có thể sử dụng printflệnh, thay vì echo:

printf '%s\n' *

printflà vượt trội so với echotrong tình huống này ở chỗ echonào không tôn trọng các "dấu gạch ngang đôi" ( --) để biểu thị sự kết thúc của danh sách đối số (trên một số hệ thống, bao gồm Ubuntu 14.04 mà là những gì tôi thử nghiệm nó trên):

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

Trong trường hợp này, bạn không thể đạt được kết quả mong muốn với echo(vì một tệp được gọi là -nđược hiểu là một tùy chọn và dấu gạch ngang kép không hoạt động, vì vậy bạn phải sử dụng printf).

Lưu ý rằng bạn phải luôn sử dụng chuỗi định dạng như trên khi xử lý dữ liệu không xác định printf, vì nếu không, bạn có thể nhận được kết quả không mong muốn (cảm ơn @ G-Man đã chỉ ra điều này trong các nhận xét!):

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

Một tập tin được gọi \nđược hiểu là một dòng mới bởi printf. Để tránh điều này, chúng tôi sử dụng một chuỗi định dạng cho printf( %s) và truyền cho nó tên của các tệp (được mở rộng thông qua toàn cầu hóa, như trước đây).

printfGiải pháp chuỗi định dạng + này có thể xử lý nhiều tên tệp (và cũng xử lý các tệp "ẩn", nghĩa là, các tệp bắt đầu bằng a ., giống như 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

Nếu printfhỗ trợ của bạn %q, bạn cũng có thể sử dụng ( printf '%q\n' *). Điều này sẽ thoát khỏi không gian, dòng mới, vv nếu có bất kỳ ký tự lạ nào trong tên tệp của bạn. (Cảm ơn @muru trong trò chuyện vì đã chỉ ra điều này !)


2
Khi xử lý dữ liệu không xác định, bạn LUÔN LUÔN sử dụng '%s'(với \nvà / hoặc bất kỳ văn bản không đổi nào khác mà bạn muốn). Ví dụ, hãy thử các lệnh touch '%.0s' foo bar; ls; printf -- *. Ngược lại, tôi không thấy lý do tại sao bạn cần --khi bạn có một '%s\n'chuỗi định dạng.
G-Man nói 'Phục hồi Monica'

@ G-Man Điểm tốt! Cảm ơn, tôi đã bỏ qua những thứ không cần thiết --với chuỗi định dạng và tôi đã chỉnh sửa bài đăng của mình để giải quyết vấn đề khác.
Doorknob

Tên -ntệp thực sự không phải là một vấn đề đối với POSIX-2001 + echo- trên các hệ thống SUSv3, echotiện ích được yêu cầu không chấp nhận bất kỳ tùy chọn nào. bash's echovà một số người khác thì xử lý các tùy chọn mặc dù, nhưng bashcó thể được biên dịch với các tùy chọn xây dựng --enable-xpg-echo-defaultđể làm cho nó cư xử một cách chính xác tất cả thời gian. Mặc dù vậy, hành vi đúngecho có nghĩa là luôn luôn diễn giải các phản ứng dữ dội thoát trong các đối số của nó. Vì vậy, bất kỳ tên tệp nào có lối thoát kiểu C sẽ không được ghi vào đầu ra w / fidelity - echosẽ dịch nó.
mikeerv

2
xin vui lòng, mọi người nên dừng giới thiệu '-' khi faq unix sau hơn 10 năm giải thích rằng sử dụng "./" sẽ tốt hơn và dễ mang theo hơn (hoạt động với tất cả các chương trình ngay cả (nhiều) chương trình không xử lý '- ')
Olivier Dulac

1
@OliverDulac - thậm chí sẽ không hỗ trợ [w / a tuân thủ echo.
mikeerv

8

Bạn có lẽ nên sử dụng các tiện ích fileunametiện ích để hiểu rõ hơn về những gì đang xảy ra với máy của bạn. Lỗi của bạn là dấu hiệu của một tệp thực thi nhị phân được biên dịch cho kiến ​​trúc hệ thống không tương thích với cấu trúc mà nó được gọi.

Trên máy của tôi:

uname -m; file /bin/ls

... bản in ...

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

... bởi vì tất cả đều đúng với thế giới ở đó. Tuy nhiên, đây là một số lệnh chạy từ máy tính bảng Android của tôi trên sshkết nối với máy tính để bàn của tôi ...

#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

Đây là một câu trả lời tuyệt vời bao gồm một kịch bản và giải quyết nguyên nhân tiềm ẩn tiềm ẩn.
Pranab

đọc nhầm ^^ xin lỗi. Tại sao không chỉ sao chép và sử dụng tập tin? Tại sao toàn bộ homedir điều? scp vào máy tính để bàn, tập tin trên đó và bash ./it?
Olivier Dulac

@OlivierDulac -hmm .. tôi không chắc là tôi hiểu chính xác những gì bạn đang hỏi chính xác. Các HOME=điều là vì vậy tôi chỉ có thể làm ~một loạt các lần thay vì ./arm_ls - cho thuận tiện. Toàn bộ vấn đề của bài tập là tôi không thể sử dụng nhị phân cánh tay trên máy tính để bàn x86 của mình và tôi muốn đầu ra filecho thấy rằng đó là một loại nhị phân rất khác so với bản gốc của sydtem - được hiển thị ở trên cùng. Và vì vậy, thay vì toàn bộ quá trình biên dịch chéo, tôi đã chọn trích dẫn một nhị phân không tương thích mà tôi đã có sẵn trên tay cho thiết bị x86 của mình và hiển thị kết quả cũng như cách khắc phục bashlỗi.
mikeerv

1
oh, nó chỉ là để lưu một vài gõ? ok, nhưng tôi nghĩ nó làm cho nó khó hiểu hơn nó nên (nó không phải là codegolf ^^)
Olivier Dulac

1
@OliverDulac - tất nhiên đó không phải là mã vàng, nhưng nó tiện lợi, nó hoàn toàn không mơ hồ và tôi ghét việc gõ ngón tay cái.
mikeerv

5

Sử dụng bash (hoặc nhiều shell khác), bạn có thể sử dụng hoàn thành tab để liệt kê các tệp:

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

3

Nếu bạn muốn một cái gì đó giống như ls -l(kích thước tệp, quyền, chủ sở hữu, dấu thời gian, v.v.), thì stat -- *có thể hữu ích:

$ 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: -
$ 

Ngoài ra, nếu tất cả những gì bạn muốn làm là sai chính tả ls, thì hãy thử slthay thế . ;-) (tiếp tục - thử đi ... bạn có thể phải cài đặt nó)


3

Có rất nhiều tiện ích tương tự có sẵn trên nhiều hệ thống:

dir

Theo các trang thông tin, nó tương đương với ls -C -b, nhưng nó là tệp nhị phân độc lập.

Lợi ích của việc sử dụng dir(thay vì hệ thống hoàn thành ví dụ) là có sẵn các tùy chọn khác nhau như sắp xếp, hiển thị các tệp ẩn, tô màu, v.v., giống như trong lschương trình tiêu chuẩn .

BTW, tôi đoán tên của nó xuất phát từ hệ thống windows (hay đúng hơn là dos).


1

sử dụng

 echo -- *
    find . -printf "%M\t%u\t%g\t%p\n"
    ls -C -b
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.