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


15

lsコマンドを使用しようとしてエラーが発生しました:

bash: /bin/ls: cannot execute binary file

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


おそらく、あなたlibc*soまたはあなたを台無しにしたld-linux*so
バジル・スタリンケビッチ

31
個人的には、これが奇抜な思考実験でない限り、システムの修正に集中します。
ファヒムミサ

2
@BasileStarynkevitchはそれを聞いたことがないが、Busyboxのは、一般的に入手可能であり、中にステップ実行することができます。
muru

8
...システムレスキューCD?
フェデリコポロニ

1
そのような場合の実際の問題対処する質問は、superuser.com / questions / 435988です。そして暗黙のうちに、Ubuntu Linuxでは、FreeBSDポートツリーのシェル/サッシュとして、Gentooパッケージとして、またその作者からの直接を含む他の場所で、珍しいことでsashはありません。
JdeBP

回答:


32

次の代わりにechoor 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は「Reinstate Monica」と言います

24

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

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

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に感謝ます!)


2
未知のデータを扱う場合には、あなたがすべき常に使用'%s'(と\nおよび/または必要なその他の一定のテキスト)。たとえば、コマンドを試してくださいtouch '%.0s' foo bar; ls; printf -- *。逆に、フォーマット文字列--があるときに必要な理由はわかりません'%s\n'
G-Manは「Reinstate Monica」と言います

@ G-Man良い点!おかげ--で、フォーマット文字列の不必要な部分を見落とし、他のことに対処するために投稿を編集しました。
ドアノブ

-nファイル名は正直べきではない POSIX-2001 +のためのすべての問題ではechoSUSv3のシステム上- echoユーティリティがされて必要な一切のオプションを受け入れません。bashさんechoといくつか他の人ががオプションを処理するのですが、bashビルドオプションを指定してコンパイルすることができ--enable-xpg-echo-default、それは正確にすべての時間を動作させるために。ただし、の正しい動作はecho、引数のバックラッシュエスケープを常に解釈することを意味します。そのため、Cスタイルのエスケープ含むファイル名は、忠実度のある出力に書き込まれecho変換されます。
mikeserv

2
unix faqで、「./」を使用する方がより適切で移植性があると説明されているため、unixのよくある質問を中止する必要があります。 ')
オリビエデュラック

1
@OliverDulac-それでさえ、hel [w / conformant echo
mikeserv

8

たぶん、あなたのマシンで何が起こっているのかをより良く理解するために、おそらくユーティリティfileunameユーティリティを使うべきです。エラーは、起動されたものと互換性のないシステムアーキテクチャ用にコンパイルされたバイナリ実行可能ファイルを示しています。

私のマシンで:

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、デスクトップへの接続時にAndroidタブレットから実行されるいくつかのコマンドを少し実行します...

#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

これは、1つのシナリオをカバーし、潜在的な根本原因に対処する優れた回答です。
プラナブ

誤読^^ごめんなさい。なぜファイルをコピーして使用しないのですか?なぜhomedir全体が必要なのでしょうか?デスクトップへのscp、その上のファイル、およびbash ./it?
オリビエデュラック

@OlivierDulac -hmm ..私はあなたが正確に尋ねているものの要点を得るかどうかわからない。HOME=私はちょうど行うことができるようなものはある~の代わりに、倍の束を./arm_ls 便宜のために- 。演習の全体的なポイントは、x86デスクトップでarmバイナリを使用できないことでありfile、sydtemのネイティブのバイナリとは非常に異なる種類のバイナリであることを示す出力が必要でした。そのため、クロスコンパイル全体をshpwするのではなく、x86デバイスのarm devで使用できる互換性のないバイナリをcpyして、結果とbashエラーの表示方法を示しました。
mikeserv

1
ああ、それは単にいくつかの入力を保存することでしたか?[OK]を、私はそれはそれはより多くのそれは(それがcodegolf ^^ではありません)でなければなりませんよりも、混乱する可能だと思う
オリヴィエ・デュラック

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プログラムと同様に、ソート、隠しファイルの表示、色付けなどのさまざまなオプションが利用できることです。

ところで、私はその名前がWindows(またはむしろDOS)システムから来ていると思います。


1

使用する

 echo -- *
    find . -printf "%M\t%u\t%g\t%p\n"
    ls -C -b
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.