Что использовать, когда команда «ls» не работает?

Я попытался использовать команду ls и получил ошибку:

 bash: /bin/ls: cannot execute binary file 

Что я могу использовать вместо этой команды?

7 Solutions collect form web for “Что использовать, когда команда «ls» не работает?”

Вы можете использовать команды echo или find вместо ls :

 echo * 

или:

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

Вы также можете использовать команду 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 ) и передаем ей имена файлов (с расширением через globbing, как и раньше).

Это строковое решение printf + может обрабатывать большое количество имен файлов (а также обрабатывать скрытые файлы, то есть те, которые начинаются с . , ls же, что и 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 в чате за указание на это !)

Вероятно, вы должны использовать uname 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 

Используя bash (или многие другие оболочки), вы можете использовать завершение табуляции для списка файлов:

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

Если вы хотите что-то большее, как 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: - $ 

Альтернативно, если все, что вы хотели сделать, это misspell ls , а затем попробуйте sl . 😉 (продолжайте – попробуйте … вам, возможно, придется его установить)

На многих системах имеется очень простая утилита:

 dir 

Согласно информационным страницам он эквивалентен ls -C -b , но он является автономным двоичным файлом.

Преимущество использования dir (вместо, например, системы завершения оболочки) – это доступность различных параметров, таких как сортировка, отображение скрытых файлов, раскраска и т. Д., Как и в стандартной программе ls .

Кстати, я предполагаю, что его имя исходит из системы Windows (или, скорее, dos).

использование

  echo -- * find . -printf "%M\t%u\t%g\t%p\n" ls -C -b 
  • выйдите из сценария, если строка ls не нашла соответствия
  • Когда я перенаправляю вывод ls в файл, имя файла включается в этот файл. Как я могу избежать этого?
  • Как я могу найти первый недостающий каталог в длинном пути?
  • Создание * красиво * отформатированного списка количества файлов в каталогах - awk & sed возможно
  • Команда grep с ls -a работает неправильно?
  • ls: Не показывать каталоги, которые соответствуют одному шаблону в подстановочных поисках, только файлы
  • Как отредактировать только один столбец вывода из команды ls?
  • ls занимает много времени в небольшом каталоге
  • Как показать все файлы с некоторыми фильтрами?
  • Правильно избегая выхода из трубы в xargs
  • Почему корневой вывод bash окрашен, но `sudo ls` нет?
  • Можно ли удалить префикс папки из команды `ls`
  • Linux и Unix - лучшая ОС в мире.