"ls"コマンドが機能しない場合はどうすればよいですか?

"ls"コマンドが機能しない場合はどうすればよいですか?

コマンドを試してみましたが、lsエラーが発生しました。

bash: /bin/ls: cannot execute binary file

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

答え1

代わりにechoorコマンドを使用できます。findls

echo *

または:

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

答え2

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

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て(以前のようにワイルドカード拡張を介して)ファイル名を渡します。

この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がチャットでこの点を指摘しました。! )

答え3

コンピュータで実際に何が起こっているのかをよりよく理解するには、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私のデスクトップに接続されている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

答え4

このような追加情報(ファイルサイズ、権限、所有者、タイムスタンプなど)が必要な場合は、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: -
$ 

または、スペルミスだけが必要な場合lssl代わりに試してみてください。 ;-)(続けて試してみてください...インストールする必要があるかもしれません)

関連情報