¿Qué usar cuando el comando "ls" no funciona?

15

Intenté usar el lscomando y obtuve un error:

bash: /bin/ls: cannot execute binary file

¿Qué puedo usar en lugar de este comando?

jimmij
fuente
Quizás libc*sold-linux*so
arruinaste
31
Personalmente, me concentraría en arreglar mi sistema, a menos que este sea un experimento mental extraño.
Faheem Mitha
2
@BasileStarynkevitch nunca más se supo de ella, pero Busybox es comúnmente disponibles y puede intervenir.
Muru
8
... un sistema de cd de rescate?
Federico Poloni
1
Una pregunta que aborda el problema real en tales casos es superuser.com/questions/435988 . Y lejos de ser poco común, como está implícito, sashestá disponible en Ubuntu Linux , como shells / sash en el árbol de puertos de FreeBSD, como un paquete Gentoo , así como en otros lugares, incluso directamente de su autor .
JdeBP

Respuestas:

32

Puede usar los comandos echoo en findlugar de ls:

echo *

o:

find -printf "%M\t%u\t%g\t%p\n"
Invocador
fuente
77
Yo usaríaecho -- *
Edward Torvalds
99
@Invoker: si tiene un archivo llamado -nen el directorio actual, eso se interpretaría como una bandera, no como algo para hacer eco.
MvG
2
Seríatouch ./-n
Basile Starynkevitch
1
@Invoker El orden alfabético es importante. Ejecute esa línea para un caso en el que eso rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
marque la
3
echoparece no honrar --, per se . Entonces, ¿cómo es echo -- *mejor echo "" *o mejor aún echo "The file(s) are:" *?
G-Man dice 'reinstalar a Monica' el
24

También puede usar el printfcomando, en lugar de echo:

printf '%s\n' *

printfes superior a la echode esta situación en la que echono no respetar la "doble guión" ( --) para indicar el final de la lista de argumentos (en algunos sistemas, incluyendo Ubuntu 14.04 que es lo que he comprobado en):

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

En este caso, no puede lograr el resultado deseado con echo(ya que un archivo llamado -nse interpreta como una opción, y el doble guión no funciona, por lo que debe usarlo printf).

Tenga en cuenta que siempre debe usar una cadena de formato como la anterior al tratar con datos desconocidos printf, ya que de lo contrario podría recibir resultados inesperados (¡gracias a @ G-Man por señalar esto en los comentarios!):

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 archivo llamado \nse interpreta como una nueva línea por printf. Para evitar esto, usamos una cadena de formato para printf( %s) y le pasamos los nombres de los archivos (expandidos mediante globbing, como antes).

Esta printfsolución de cadena de formato + puede manejar una amplia variedad de nombres de archivo (y también trata archivos "ocultos", es decir, aquellos que comienzan con a ., lo mismo 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 es printfcompatible %q, también puede usar eso ( printf '%q\n' *). Esto escapará a espacios, nuevas líneas, etc. si hay caracteres extraños en sus nombres de archivo. (¡Gracias a @muru en el chat por señalar esto !)

Perilla de la puerta
fuente
2
Al tratar con datos desconocidos, SIEMPRE debe usar '%s'(con \ny / o cualquier otro texto constante que desee). Por ejemplo, prueba los comandos touch '%.0s' foo bar; ls; printf -- *. Por el contrario, no veo por qué lo necesitas --cuando tienes una '%s\n'cadena de formato.
G-Man dice 'reinstalar a Monica' el
@ G-Man Buen punto! Gracias, pasé por alto lo innecesario --con la cadena de formato, y he editado mi publicación para abordar la otra cosa.
Pomo
El -nnombre de archivo honestamente no debería ser un problema para POSIX-2001 + echo- en los sistemas SUSv3 echose requiere que la utilidad no acepte ninguna opción. bashSin echoembargo, algunos y otros sí manejan la opción, pero bashse pueden compilar con la opción de compilación --enable-xpg-echo-defaultpara que se comporte correctamente todo el tiempo. Sinecho embargo, el comportamiento correcto significa siempre interpretar escapes de reacción en sus argumentos. Por lo tanto, cualquier nombre de archivo con un escape de estilo C no se escribiría en la salida con fidelidad, echolo traduciría.
mikeserv
2
por favor, por favor, todos deberían dejar de recomendar '-' cuando las preguntas frecuentes de Unix desde hace más de 10 años explican que usar "./" es mejor y más portátil (funciona con todos los programas, incluso los (muchos) que no manejan "- ')
Olivier Dulac
1
@OliverDulac: ni siquiera eso ayudaría [con una conformidad echo.
mikeserv
8

Probablemente debería usar las utilidades filey unamepara tener una mejor idea de qué demonios está pasando con su máquina. Su error es indicativo de un ejecutable binario compilado para una arquitectura de sistema incompatible con aquel en el que se invoca.

En mi máquina

uname -m; file /bin/ls

...huellas dactilares...

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

... porque todo está bien con el mundo allí. Sin embargo, aquí hay una pequeña ejecución de algunos comandos que se ejecutan desde mi tableta Android en una sshconexión a mi escritorio ...

#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
fuente
Esta es una gran respuesta que cubre un escenario y aborda la posible causa subyacente.
Pranab
mal leído ^^ lo siento. ¿Por qué no simplemente copiar y usar el archivo? ¿Por qué todo el asunto de Homedir? scp al escritorio, archivo en él y bash ./it?
Olivier Dulac
@ OlivierDulac -hmm ... no estoy seguro de entender lo que estás preguntando exactamente. La HOME=cuestión es que puedo hacer ~muchas veces en lugar de hacerlo ./arm_ls , por conveniencia. El punto principal del ejercicio es que no puedo usar el binario arm en mi escritorio x86, y quería que la salida filemostrara que es un tipo de binario muy diferente al nativo del sistema, que se muestra en la parte superior. Y así, en lugar de shpw una compilación cruzada completa, elegí copiar un binario incompatible que tenía disponible en mi dev de brazo para mi dispositivo x86 y mostrar los resultados y cómo germinar el basherror.
mikeserv
1
oh, fue solo para ahorrar unos pocos tipeos? ok, pero creo que lo hace más confuso de lo que debería ser (no es codegolf ^^)
Olivier Dulac
1
@OliverDulac: por supuesto, no es un código dorado, pero es conveniente, no es del todo ambiguo y odio escribir con el pulgar.
mikeserv
5

Usando bash (o muchos otros shells), puede usar la finalización de pestañas para listar archivos:

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

Si desea algo más como ls -l(tamaño de archivo, permisos, propietario, marcas de tiempo, etc.), entonces stat -- *podría ser útil:

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

Alternativamente, si todo lo que desea hacer es escribir mal ls, intente en su sllugar . ;-) (continúe - pruébelo ... puede que tenga que instalarlo)

Trauma digital
fuente
3

Hay una utilidad muy similar disponible en muchos sistemas:

dir

De acuerdo con las páginas de información, es equivalente ls -C -b, pero es un archivo binario independiente.

El beneficio de usar dir(en lugar de, por ejemplo, el sistema de finalización de shell) es la disponibilidad de diferentes opciones como ordenar, mostrar archivos ocultos, colorear, etc., al igual que en el estándarls programa .

Por cierto, supongo que su nombre proviene del sistema Windows (o mejor dicho, DOS).

jimmij
fuente
1

utilizar

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

fuente