コマンドを試してみましたが、ls
エラーが発生しました。
bash: /bin/ls: cannot execute binary file
このコマンドの代わりに何を使用できますか?
答え1
代わりにecho
orコマンドを使用できます。find
ls
echo *
または:
find -printf "%M\t%u\t%g\t%p\n"
答え2
printf
echoの代わりに次のコマンドを使用することもできます。
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: -
$
または、スペルミスだけが必要な場合ls
はsl
代わりに試してみてください。 ;-)(続けて試してみてください...インストールする必要があるかもしれません)