Que faut-il utiliser lorsque la commande «ls» ne fonctionne pas?

15

J'ai essayé d'utiliser la lscommande et j'ai eu une erreur:

bash: /bin/ls: cannot execute binary file

Que puis-je utiliser à la place de cette commande?

jimmij
la source
Peut-être que vous avez libc*sold-linux*so
foiré
31
Personnellement, je me concentrerais sur la réparation de mon système, sauf s'il s'agit d'une expérience de pensée farfelue.
Faheem Mitha
2
@BasileStarynkevitch n'en a jamais entendu parler, mais Busybox est couramment disponible et peut intervenir.
muru
8
... un CD de sauvetage du système?
Federico Poloni
1
Une question traitant du problème réel dans de tels cas est superuser.com/questions/435988 . Et loin d'être rare, comme cela sashest implicite, est disponible sur Ubuntu Linux , sous forme de shells / sash dans l'arborescence des ports FreeBSD, sous forme de package Gentoo , ainsi que dans d'autres endroits, y compris directement de son auteur .
JdeBP

Réponses:

32

Vous pouvez utiliser les commandes echoou findau lieu de ls:

echo *

ou:

find -printf "%M\t%u\t%g\t%p\n"
Invocateur
la source
7
J'utiliseraisecho -- *
Edward Torvalds
9
@Invoker: Si vous aviez un fichier appelé -ndans le répertoire courant, cela serait interprété comme un drapeau, pas quelque chose à faire écho.
MvG
2
Ce seraittouch ./-n
Basile Starynkevitch
1
@Invoker L'ordre alphabétique est important. Exécutez cet oneliner pour un cas où cela fait une différence:rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
jlliagre
3
echone semble pas l' honneur --, en tant que tel . Alors, comment est-il echo -- *meilleur que echo "" *ou, mieux encore echo "The file(s) are:" *,?
G-Man dit `` Réintègre Monica '' le
24

Vous pouvez également utiliser la printfcommande, au lieu de l'écho:

printf '%s\n' *

printfest supérieur à echodans cette situation en ce queecho il ne respecte pas le "double tiret" ( --) pour signifier la fin de la liste des arguments (sur certains systèmes, dont Ubuntu 14.04 sur lequel je l'ai testé):

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

Dans ce cas, vous ne pouvez pas obtenir le résultat souhaité avec echo(car un fichier appelé -nest interprété comme une option et le double tiret ne fonctionne pas, vous devez donc utiliser printf).

Notez que vous devez toujours utiliser une chaîne de format comme celle ci-dessus lorsque vous traitez avec des données inconnues printf, car sinon vous pourriez recevoir des résultats inattendus (merci à @ G-Man de l'avoir signalé dans les commentaires!):

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

Un fichier appelé \n est interprété comme une nouvelle ligne par printf. Pour éviter cela, nous utilisons une chaîne de formatage pour printf( %s) et lui passons les noms des fichiers (développés via globbing, comme précédemment).

Cette printfsolution de chaîne de formatage + peut gérer une grande variété de noms de fichiers (et traite également les fichiers "cachés", c'est-à-dire ceux commençant par un. , les mêmes que 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

Si vos printfsupports %q, vous pouvez également utiliser cela ( printf '%q\n' *). Cela échappera aux espaces, aux nouvelles lignes, etc. s'il y a des caractères étranges dans vos noms de fichiers. (Merci à @muru dans le chat pour l'avoir signalé !)

Poignée de porte
la source
2
Lorsque vous traitez avec des données inconnues, vous devez TOUJOURS utiliser '%s'(avec \net / ou tout autre texte constant que vous souhaitez). Par exemple, essayez les commandes touch '%.0s' foo bar; ls; printf -- *. Inversement, je ne vois pas pourquoi vous avez besoin --lorsque vous avez une '%s\n'chaîne de format.
G-Man dit `` Réintègre Monica '' le
@ G-Man Bon point! Merci, j'ai ignoré l'inutile --avec la chaîne de formatage et j'ai édité mon message pour répondre à l'autre chose.
Poignée de porte
Le -nnom de fichier honnêtement ne devrait pas être un problème du tout pour un Posix-2001 + echo- sur les systèmes SUSv3 l' echoutilitaire est nécessaire de ne pas accepter toutes les options que ce soit. bash's echoet quelques autres gèrent cependant l'option, mais bashpeuvent être compilés avec l'option build --enable-xpg-echo-defaultpour qu'elle se comporte correctement tout le temps. Un comportement correct pour echo, cependant, signifie toujours interpréter les échappements de jeu dans ses arguments. Ainsi, tout nom de fichier avec un échappement de style C ne serait pas écrit dans la sortie avec fidélité - echole traduirait.
mikeserv
2
s'il vous plaît, s'il vous plaît, tout le monde devrait cesser de recommander '-' lorsque la FAQ Unix depuis plus de 10 ans explique que l'utilisation de "./" est meilleure et plus portable (fonctionne avec tous les programmes, même ceux (nombreux) qui ne gèrent pas '- ')
Olivier Dulac
1
@OliverDulac - même pas cela aiderait [w / a conformant echo.
mikeserv
8

Vous devriez probablement utiliser les utilitaires fileet unamepour avoir une meilleure idée de ce qui se passe avec votre machine. Votre erreur indique un exécutable binaire compilé pour une architecture système incompatible avec celle sur laquelle il est invoqué.

Sur ma machine:

uname -m; file /bin/ls

... impressions ...

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

... parce que tout va bien avec le monde là-bas. Cependant, voici un petit aperçu de certaines commandes exécutées à partir de ma tablette Android sur une sshconnexion à mon bureau ...

#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
mikeserv
la source
Il s'agit d'une excellente réponse qui couvre un scénario et traite de la cause sous-jacente potentielle.
Pranab
mal lu ^^ désolé. pourquoi ne pas simplement copier et utiliser le fichier? pourquoi toute cette affaire homedir? scp au bureau, fichier dessus et bash ./it?
Olivier Dulac
@OlivierDulac -hmm .. je ne suis pas sûr d'avoir compris ce que vous demandez exactement. Le HOME=truc, c'est que je peux faire plusieurs ~fois au lieu de ./arm_ls - pour plus de commodité. L'intérêt de l'exercice est que je ne peux pas utiliser le binaire arm sur mon bureau x86, et je voulais que la sortie de filemontre qu'il s'agit d'un type binaire très différent de celui natif du sydtem - qui est montré en haut. Et donc plutôt que de shpw toute une compilation croisée, j'ai choisi de cpy un binaire incompatible que j'avais à ma disposition sur mon bras pour mon appareil x86 et de montrer les résultats et comment corriger l' basherreur.
mikeserv
1
oh, c'était juste pour sauver quelques tapages? ok, mais je pense que ça rend plus confus qu'il ne devrait l'être (ce n'est pas du codegolf ^^)
Olivier Dulac
1
@OliverDulac - bien sûr, ce n'est pas du code or, mais c'est pratique, ce n'est pas du tout ambigu, et je déteste taper au pouce.
mikeserv
5

En utilisant bash (ou de nombreux autres shells), vous pouvez utiliser la complétion de tabulation pour lister les fichiers:

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

Si vous voulez quelque chose de plus ls -l(taille du fichier, autorisations, propriétaire, horodatages, etc.), cela stat -- *pourrait être utile:

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

Sinon, si tout ce que vous vouliez faire était de mal orthographier ls, essayez slplutôt . ;-) (continuez - essayez-le ... vous devrez peut-être l'installer)

Traumatisme numérique
la source
3

Un utilitaire très similaire est disponible sur de nombreux systèmes:

dir

Selon les pages d'informations, il est équivalent à ls -C -b, mais il s'agit d'un fichier binaire autonome.

L'avantage de l'utilisation dir(au lieu de par exemple le système d'achèvement du shell) est la disponibilité de différentes options comme le tri, l'affichage des fichiers cachés, la coloration, etc., tout comme dans le lsprogramme standard .

BTW, je suppose que son nom vient du système Windows (ou plutôt DOS).

jimmij
la source
1

utilisation

 echo -- *
    find . -printf "%M\t%u\t%g\t%p\n"
    ls -C -b

la source