web-dev-qa-db-ja.com

「ls」コマンドが機能しない場合、何を使用しますか?

lsコマンドを使用しようとすると、エラーが発生しました。

bash: /bin/ls: cannot execute binary file

このコマンドの代わりに何を使用できますか?

16
user117441

echoの代わりにfindまたはlsコマンドを使用できます。

echo *

または:

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

Echoの代わりにprintfコマンドを使用することもできます。

printf '%s\n' *

この状況では、printfechoよりも優れており、echonotを意味し、「ダブルダッシュ」(--)を尊重して引数リストの最後(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)。

alwaysprintfを使用して不明なデータを処理する場合は、上記のようなフォーマット文字列を使用する必要があることに注意してください。コメントで!):

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 +フォーマット文字列ソリューションは、さまざまなファイル名を処理できます(「隠し」ファイル、つまり.で始まるファイルも扱います。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のチャットに感謝 !)

25
Doorknob

おそらく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

...そこの世界ですべてが正しいからです。ただし、ここでは、私のデスクトップへのssh接続でmy Android Tabletから実行されるいくつかのコマンドを少し実行します...

#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
8
mikeserv

Bash(または他の多くのシェル)を使用すると、タブ補完を使用してファイルを一覧表示できます。

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

もっと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を試してください です。 ;-)(続けて-試してみてください...インストールする必要があるかもしれません)

4
Digital Trauma

多くのシステムで利用できる非常に類似したユーティリティがあります:

dir

情報ページによると、これはls -C -bですが、スタンドアロンのバイナリファイルです。

(たとえば、シェル補完システムの代わりに)dirを使用する利点は、標準のlsプログラムと同様に、並べ替え、隠しファイルの表示、色付けなどのさまざまなオプションを利用できることです。

ところで、その名前はウィンドウズ(またはむしろdos)システムに由来すると思います。

3
jimmij

使用する

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