“ls”명령이 작동하지 않을 때 무엇을 사용해야합니까?


15

나는 사용하려고 ls명령 오류가 발생했습니다.

bash: /bin/ls: cannot execute binary file

이 명령 대신 무엇을 사용할 수 있습니까?


아마도 당신은 당신 libc*so이나 당신을 망쳐 놓았을 것입니다ld-linux*so
Basile Starynkevitch

31
개인적으로, 나는 이것이 이상한 생각 실험이 아니라면 시스템을 고치는 데 집중할 것이다.
Faheem Mitha

2
@BasileStarynkevitch는 들어 본 적이 없지만 Busybox는 일반적으로 사용할 수 있으며 들어올 수 있습니다.
muru

8
... 시스템 복구 CD?
Federico Poloni 2016 년

1
이러한 경우 실제 문제해결 하는 질문 은 superuser.com/questions/435988 입니다. 그리고 지금까지 묵시적으로, 드문되는 것을, sash볼 수 있습니다 우분투 리눅스 로, 쉘 / 창틀 과 FreeBSD 포트 트리에서, 젠투 패키지 뿐만 아니라 포함하여 다른 장소 저자에서 직접 .
JdeBP

답변:


32

대신에 echo또는 find명령을 사용할 수 있습니다 ls.

echo *

또는:

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

7
나는 사용합니다echo -- *
Edward Torvalds

9
@Invoker : -n현재 디렉토리에서 호출 된 파일이있는 경우 , 에코 할 것이 아니라 플래그로 해석됩니다.
MvG

2
그것은 것touch ./-n
실레 Starynkevitch

1
@Invoker 알파벳 순서가 중요합니다. 차이가 나는 경우를 위해 oneliner를 실행하십시오.rm -rf /tmp/foo && mkdir /tmp/foo && cd /tmp/foo && touch ./-n oops && set -x && ls && echo *
jlliagre

3
echo명예되지 것 --, 그 자체 . 그래서 어떻게 echo -- *어떤보다 더 좋은 echo "" *, 더 나은 아직, 또는 echo "The file(s) are:" *?
G-Man, 'Reinstate

24

printfecho 대신 다음 명령을 사용할 수도 있습니다 .

printf '%s\n' *

printfecho이 상황에서 인수 목록의 끝을 나타 내기 위해 "이중 대시"( )를 고려 echo하지 않는 점 에서 우수 --합니다 (우분투 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 )에 하고 파일 이름을 전달합니다 (전과 같이 globbing을 통해 확장).

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 에게 감사드립니다 !)


2
알 수없는 데이터를 다룰 때, 당신이해야 항상 사용 '%s'(과 \n및 / 또는 원하는 다른 일정 텍스트). 예를 들어, 명령을 시도하십시오 touch '%.0s' foo bar; ls; printf -- *. 반대로, 형식 문자열 --이있을 때 왜 필요한지 알 수 없습니다 '%s\n'.
G-Man, 'Reinstate

@ G-Man 좋은 지적입니다! 고마워, 나는 --형식 문자열로 불필요한 것을 간과 했고 다른 것을 다루기 위해 게시물을 편집했습니다.
Doorknob

-n파일 이름은 정직 하지 않아야 는 POSIX-2001 +에 전혀 문제가 될 echo가 SUSv3 시스템 - echo유틸리티입니다 필요한 어떠한 옵션을 적용 할 수 없습니다. bashecho어떤 다른 사람이 비록 옵션을 처리 할 수 있지만, bash빌드 옵션으로 컴파일 할 수 있습니다 --enable-xpg-echo-default제대로 모든 시간의 동작하도록 할 수 있습니다. 그러나에 대한 올바른 동작 은 인수에서 항상 백래시 이스케이프를 해석 echo하는 것을 의미 합니다. 따라서 C 스타일 이스케이프 있는 파일 이름은 충실도없이 출력에 기록 되지 않습니다 . echo
mikeserv

2
제발, 제발, 제발, 모든 사람들이 '-'명령을 중지해야 10 년 이상 유닉스 자주 묻는 질문은 "./"를 사용하는 것이 더 낫고 더 휴대 가능하다는 것을 설명 할 때 ')
Olivier Dulac

1
@OliverDulac-그것조차도 준수하지 않을 것입니다 echo.
mikeserv 2016 년

8

당신은 아마 당신 과 당신의 기계에 무슨 일이 일어나고 있는지에 대한 더 나은 아이디어를 얻으려면 fileand 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내 데스크톱 과의 연결로 내 안드로이드 태블릿에서 실행되는 몇 가지 명령이 있습니다 ...

#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

이것은 하나의 시나리오를 다루고 잠재적 인 근본 원인을 해결하는 훌륭한 답변입니다.
Pranab

오해 ^^ 죄송합니다. 왜 파일을 복사하고 사용하지 않습니까? 왜 모든 홈 디어일까요? scp를 바탕 화면에 파일로 저장하고 bash ./it?
Olivier Dulac

@OlivierDulac-흠 .. 내가 정확히 무엇을 요구하는지 잘 모르겠습니다. HOME=난 그냥 할 수 있도록 것입니다 ~배의 무리 대신의 ./arm_ls 편의를 위해를 -. 연습의 요점은 x86 데스크탑에서 arm 바이너리를 사용할 수 없으며, 출력이 filesydtem의 기본 바이너리와 매우 다른 종류의 바이너리임을 보여주기를 원한다는 것입니다. 그래서 전체 크로스 컴파일을 shpw하기보다는 x86 장치의 팔 장치에서 사용할 수있는 호환되지 않는 바이너리를 cpy로 선택하고 결과와 bash오류를 발생 시키는 방법을 보여주었습니다 .
mikeserv 2016 년

1
오, 그냥 몇 가지 타이핑을 저장하는 것이 었습니까? 알았지 만, 그것이 생각보다 혼란 스럽습니다 (codegolf가 아닙니다 ^^)
Olivier Dulac

1
@OliverDulac-물론 코드 골드는 아니지만 편리하고 전혀 모호하지 않으며 엄지 입력을 싫어합니다.
mikeserv 2016 년

5

bash (또는 다른 많은 쉘)를 사용하여 탭 완성을 사용하여 파일을 나열 할 수 있습니다.

$ thisisnotacommand ./public_html/<TAB>
acc/              papers/           android/          l/
sdr/              blast             formalcss.html    switch/
busy/             formalcss.tar.gz  others/           together.jpg

3

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 . ;-) (계속해보십시오. 설치해야 할 수도 있습니다)


3

많은 시스템에서 매우 유사한 유틸리티를 사용할 수 있습니다.

dir

정보 페이지에 따르면이 ls -C -b파일 은에 해당 하지만 독립 실행 형 이진 파일입니다.

dir셸 완성 시스템 대신 사용 하면 표준 ls프로그램 에서와 같이 정렬, 숨겨진 파일 표시, 색상 표시 등과 같은 다양한 옵션 을 사용할 수 있다는 이점이 있습니다 .

BTW, 나는 그 이름이 창문 (또는 오히려 할 일) 시스템에서 온 것 같아요.


1

사용하다

 echo -- *
    find . -printf "%M\t%u\t%g\t%p\n"
    ls -C -b
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.