Що використовувати, коли команда «ls» не працює?


15

Я спробував скористатися lsкомандою, і сталася помилка:

bash: /bin/ls: cannot execute binary file

Що я можу використовувати замість цієї команди?


Можливо, ви накрутили свого libc*soчи свогоld-linux*so
Базиле Старинкевича

31
Особисто я б зосередився на виправленні своєї системи, якщо тільки це не якийсь дурний продуманий експеримент.
Faheem Mitha

2
@BasileStarynkevitch ніколи не чув про це, але Busybox є загальнодоступним і може вступити.
Muru

8
... компакт-диск для порятунку?
Федеріко Полоні

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 -- *
Едвард Торвальдс

9
@Invoker: Якщо -nу поточному каталозі у вас є файл, який викликається , це трактується як прапор, а не щось відлуння.
MvG

2
Було бtouch ./-n
Базиле Старинкевич

1
@Invoker Алфавітний порядок має значення. Запустіть цей oneliner для випадку, коли це має значення: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:" *,?
G-Man каже: "Відновіть Моніку"

24

Ви можете також використовувати printfкоманду замість відлуння:

printf '%s\n' *

printfechoв цій ситуації перевершує те, 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 каже: "Відновіть Моніку"

@ G-Man Добрий момент! Дякую, я пропустив непотрібне --за допомогою рядка формату, і я відредагував своє повідомлення, щоб вирішити інше.
Дорноб

Ім’я -nфайлу чесно не повинно бути проблемою для POSIX-2001 + echo- для систем SUSv3 echoутиліта вимагає не приймати жодних параметрів. bash«S echoі деякі інші роблять обробляти варіант , хоча, але bashможе бути скомпільовано з опцією збірки , --enable-xpg-echo-defaultщоб зробити його правильно поводитися весь час. Правильна поведінка echo, однак, означає, що завжди інтерпретувати зворотний люфт у своїх аргументах. Отже, будь-яке ім'я файлу зі стилем C-стилю не записується для виведення w / fidelity - echoперекладало б його.
mikeserv

2
будь-ласка, будь ласка, всі повинні припинити рекомендувати "-", коли unix faq вже більше 10 років пояснює, що використання "./" краще і портативніше (працює з усіма програмами, навіть з (багатьма), які не обробляють "- ')
Олів'є Дулак

1
@OliverDulac - навіть це не допоможе [w / a compantant 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

Це чудова відповідь, яка охоплює один сценарій та вирішує потенційну причину.
Пранаб

неправильно читати ^^ вибачте. чому б не просто скопіювати та використовувати файл? чому вся річ хомедір? scp на робочий стіл, файл на ньому та bash ./it?
Олів’є Дулак,

@OlivierDulac-хм .. я не впевнений, що я розумію, що саме ти запитуєш. HOME=Річ , так що я можу просто зробити ~купу раз замість ./arm_ls - для зручності. Вся справа в тому, що я не можу використовувати бінарний кронштейн на моєму робочому столі x86, і я хотів, щоб результат fileпоказав, що це бінарний дуже різний вид, ніж рідний сидтем - який показано вгорі. І тому замість того, щоб shpw ціла перехресна компіляція, я вирішив скопіювати несумісний бінарний файл, який я мав у мене в наявності на моєму девайсі на моєму пристрої x86 та показав результати та як видалити bashпомилку.
mikeserv

1
о, це було просто, щоб зберегти кілька набравши? гаразд, але я думаю, це робить його більш заплутаним, ніж це має бути (це не кодегольф ^^)
Олів'є Дулак,

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.