我尝试使用该ls
命令并收到错误:
bash: /bin/ls: cannot execute binary file
我可以用什么来代替这个命令?
答案1
您可以使用echo
或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
...因为那里的世界一切都好。然而,这里有一些从我的 Android 平板电脑连接ssh
到我的桌面运行的命令......
#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
代替。 ;-)(继续 - 尝试一下...你可能需要安装它)