ls -Al에서 파일 이름 (공백 포함) 만 출력하는 방법은 무엇입니까?


78

이 구성의 파일 또는 디렉토리 이름 만 에코해야합니다.

ls -Al | while read string
do
...
done

ls -Al 출력 :

drwxr-xr-x  12 s162103  studs         12 march 28 12:49 personal domain
drwxr-xr-x   2 s162103  studs          3 march 28 22:32 public_html
drwxr-xr-x   7 s162103  studs          8 march 28 13:59 WebApplication1

예를 들어 시도하면

ls -Al | while read string
do
echo "$string" | awk '{print $9}
done

그런 다음 공백없이 파일과 디렉토리 만 출력하십시오. 파일 또는 디렉토리에 "개인 도메인"과 같은 공백이 있으면 "개인"이라는 단어 만 사용됩니다.

매우 간단한 해결책이 필요합니다. 어쩌면 awk보다 더 나은 해결책이있을 수 있습니다.


2
왜 안돼 ls -Al *' '*? 파싱 ls의 출력은 결코 좋은 것으로 이끌지 않습니다.
manatwork

1
* nix에서 작동하는 무언가가 필요하면을 사용하지 마십시오 ls -Al | while. 간단하고 안정적인 방법은 for string in *; do echo "$string"; done입니다.
forcefsck

이 구성으로 만 필요합니다.
Alex Zern

1
필요한 ls 가요? 구문 분석 ls과 "모든 nix에서 작동하며 문제가 발생해도 중단되지 않습니다"는 잘 어울리지 않습니다.
terdon

답변:


97

당신은 정말의 출력을 구문 분석하지합니다ls . 이 과제가 숙제이고 필요한 경우 교수님은 그들이 말하는 내용을 모릅니다. 왜 이런 식으로하지 않습니까?

좋은 ...

find ./  -printf "%f\n"

또는

for n in *; do printf '%s\n' "$n"; done

... 나쁜 ...

당신이 경우 정말 정말 사용하려면 ls, 당신은 좀 더 강력한 이런 일을 수행하여 만들 수 있습니다 :

ls -lA | awk -F':[0-9]* ' '/:/{print $2}'

... 그리고 못생긴

당신이 경우 주장 이 틀린, 위험한 방법 일을 단지 사용해야 while루프를,이 작업을 수행 :

ls -Al | while IFS= read -r string; do echo "$string" | 
    awk -F':[0-9]* ' '/:/{print $2}'; done

하지만 진지하게하지 마십시오.


drwx------ 2 s162103 studs 3 oct. 9 2012 .ssh drwxr-xr-x 3 s162103 studs 6 oct. 25 09:02 .subversion drwxrwxrwt 3 s162103 studs 3 nov. 15 2012 .TempoItems때때로 나는 시간없이 날짜를 얻었고, 단지 년과
개크가

1
@AlexZern 글쎄, 그것이의 출력을 분석하지 않는 이유 중 하나이다 ls.
terdon

2
@AlexZern 왜 -l스위치 가 필요한 가요? 파일 이름 만 있으면 실행하십시오 ls -A. -l출력을 구문 분석해야하기 때문에 사용 하면 삶이 더 어려워집니다.
terdon

액세스, 날짜, 소유자 등과 같은 추가 정보가 필요하기 때문에 그리고 공백이있는 인쇄 파일과 dir 이름을 제외하고는 잘 작동하는 거대한 스크립트를 작성했습니다.
Alex Zern

3
그래 그리고 나서. 우리가 여기있는 것은 XY 문제 입니다. ls필요한 것을 얻는 가장 좋은 방법은 아닙니다. 수집하고자하는 정보를 설명하는 새로운 질문을 게시 해 주시면 그 방법을 제안 해 드리겠습니다. 또는 스크립트를 그대로 사용하고 위의 제안 중 하나를 사용하여 이름 만 인쇄 할 수 있습니다. 그러나 진지하게 파싱 ls하지 마십시오. 새로운 질문에서 무엇을하려고하는지 정확하게 알려주십시오.
terdon

74

ls -A1작동하지 않는 이유가 있습니까?

예 :

$ touch file1 file2 file\ with\ spaces
$ ls -Al
total 0
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file1
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file2
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file with spaces
$ ls -A1
file1
file2
file with spaces
$

* 참고 : 대문자 A와 숫자 1입니다.


4
-1은 천재입니다. 나는 그것이 가능한지 몰랐다. (알다시피. RTFM)
게으른 코더

당신은 파일 이름을 나열 할 경우 만 현재 디렉토리 작동 다른 디렉토리에서 ~ / 프로젝트는 다음 파일 이름 대신에 전체 경로를 얻을 것이라고
thecotne

Mac 10.9.5의 @thecotne에는 파일 이름 만 나열됩니다. 어떤 OS를 사용하고 있습니까?
AJP

이 ls ~ / projects / *. sublime-project -A1 for ls ~ / projects -A1을 실행 중입니다. 이름 만 얻습니다
thecotne

3
@TheLazyCoder는 설명서를 읽을 것으로 예상되지 않습니다.
c24w

41

왜 아무도이 간단한 명령을 언급하지 않았는지 궁금합니다.

ls -a | sort

2
훌륭한! sort다중 열 블록이 단일 열로 피벗되지 않도록 파이핑하는 방법을 알고 있습니까?
msciwoj

@msciwoj 그냥 공백으로 구분 된 문자열을 취해서 끝줄로 구분하여 출력합니다
Ben

완전한! 왜 이것이 실제 답변으로 표시되지 않았습니까!?
夏 期 劇場

3
출력이 터미널로 이동하지 않을 때 (단일 열 출력)으로 돌아가고 인쇄 할 수없는 문자 인용 / 교체를 비활성화 하기 때문에 여기에서 작동 ls합니다 ls -1(@Kusalananda, ls여전히 POSIX 호환이 아닌 경우). ls출력이 이미 정렬되었습니다. 따라서 파이프를 연결하면 sort아무 것도 수행하지 않으며 출력이 엉망이되거나 (파일 이름에 개행 문자가 포함 된 경우) 텍스트가 아닌 파일 이름이 실패합니다. ls -a | cat더 좋을 것입니다. 또는 ls -A1이미 언급 한대로 더 좋습니다 (일반적으로 터미널에 표시 될 때 대체 / 견적을 원하기 때문에)
Stéphane Chazelas

1
@ StéphaneChazelas 참고. ls출력이 터미널이 아닌 경우 다르게 작동합니다.
Kusalananda

3

당신의 출력을 구문 분석 할 수 없습니다 ls말할 것도없고, ls -l줄 바꿈 때문에, 공간이 파일 이름에있는만큼 유효한 문자가처럼. 또한과 같은 출력을 갖는 심볼릭 링크를 고려해야 ... foo -> bar합니다.

-l파일 이름 만 원한다면 왜 사용 하시겠습니까?

그냥 해:

for file in *; do
  ...
done

쉘에 따라 도트 파일 ( .및 제외 ..) 을 포함 시키려면 다음 을 수행하십시오.

zsh:

for file in *(ND); do
  ...
done

bash:

shopt -s nullglob dotglob
for file in *; do
  ...
done

ksh93:

FIGNORE='@(.|..)'
for file in ~(N)*; do
  ...
done

POSIXly :

for file in .[!.]* ..?* *; do
  [ -e "$file" ] || [ -L "$file" ] || continue
  ...
done

1

어때요 :

for file in * .[!.]*
do
  printf "%s\n" "$file"
done

1
ls -Al | tr -s ' ' | cut -f9- -d' '

tr을 사용하여 여러 공간을 단일 공간으로 압축 한 다음 cut을 사용하여 필드를 분할 할 수 있습니다




-1
ls --file *|grep ^ 

어떤 디렉토리에 어떤 파일이 있는지 표시합니다.


나는 이것이 문제를 해결한다고 생각하지 않는다.
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.