"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' *

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. 그렇지 않으면 예상치 못한 결과가 나타날 수 있습니다(주석에서 이 사실을 지적한 @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대신 시도해 보세요. ;-) (계속해서 시도해 보세요... 설치해야 할 수도 있습니다)

관련 정보