ls
コマンドを使用しようとすると、エラーが発生しました。
bash: /bin/ls: cannot execute binary file
このコマンドの代わりに何を使用できますか?
echo
の代わりにfind
またはls
コマンドを使用できます。
echo *
または:
find -printf "%M\t%u\t%g\t%p\n"
Echoの代わりにprintf
コマンドを使用することもできます。
printf '%s\n' *
この状況では、printf
はecho
よりも優れており、echo
はnotを意味し、「ダブルダッシュ」(--
)を尊重して引数リストの最後(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のチャットに感謝 !)
おそらく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
Bash(または他の多くのシェル)を使用すると、タブ補完を使用してファイルを一覧表示できます。
$ thisisnotacommand ./public_html/<TAB>
acc/ papers/ Android/ l/
sdr/ blast formalcss.html switch/
busy/ formalcss.tar.gz others/ together.jpg
もっと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
を試してください です。 ;-)(続けて-試してみてください...インストールする必要があるかもしれません)
多くのシステムで利用できる非常に類似したユーティリティがあります:
dir
情報ページによると、これはls -C -b
ですが、スタンドアロンのバイナリファイルです。
(たとえば、シェル補完システムの代わりに)dir
を使用する利点は、標準のls
プログラムと同様に、並べ替え、隠しファイルの表示、色付けなどのさまざまなオプションを利用できることです。
ところで、その名前はウィンドウズ(またはむしろdos)システムに由来すると思います。
使用する
echo -- *
find . -printf "%M\t%u\t%g\t%p\n"
ls -C -b