ls 명령에서 1 열의 출력을 에코하는 방법은 무엇입니까?


54

ls 명령을 수행하면 출력은 다음과 같습니다.

file1 file2 file3 file4

이 경우 file2의 특정 출력 열만 표시 할 수 있습니까? 나는 성공하지 않고 다음을 시도했다.

echo ls | $2

기본적으로 내가하고 싶은 것은 두 번째 열만 에코하는 것입니다.이 경우 에코하고 싶습니다.

file2

2
실제로 출력 을 원하는 상황은 무엇입니까 ls?
michas

11
일반적으로 ls를 구문 분석 해서는 안됩니다 . 필요한 정보를 얻는 더 좋은 방법 은 거의 항상 있습니다.
terdon

P (미안 해요에 allways 그 문구 좋아) 열 수는 이름의 파일에 따라 달라집니다 및 폴더 그래서 2 열이 원하는 하나 일 수 있거나하지 않을 수 있습니다, 또는 하나 일 수 있습니다 : 그 낯선 사람을 할 것입니다 ls및 일부 파일 / 폴더를 만든 후에는 더 이상 원하는 것이 아닐 수 있습니다. terdon이 지적한 것처럼 확실히 원하는 것을 얻는 더 좋은 방법이 있습니다
YoMismo

답변:


81

다음 명령은 ls 출력을 하나의 열로 형식화합니다.

ls -1 /directory

2
그러나 OP에 관심이있는 단 하나의 열만 제공하는 것은 아닙니다.
Anthon

1
올바르게하기 위해 : ls -1 /directory | head -2 | tail -1또는ls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'더 간단한 것 같습니다
Fiximan

3
내가 찾고 있지만 OP의 질문에 대한 대답은 아닙니다.
Michael Lang

36

당신은 이것을 찾고 있습니다 :

ls -C | awk '{ print $2 }'

그러나 나중에이 파일 이름을 사용하려고한다고 가정하면 공백이 포함 된 파일 이름이 손상되므로이 작업을 수행하지 마십시오. 대신 파일을 배열에 넣고 두 번째 파일을 가져 오면 구문 분석을 전혀하지 않아도됩니다.

files=(*)
printf '%s\n' "${files[1]}"

파일을 다시 가져 오는 순서는의 값에 따라 다릅니다 LC_COLLATE. 따라서 LC_COLLATE=C모든 경우에 "표준"정렬을 원할 경우 먼저 설정 하는 것이 좋습니다.


배열 인덱스 1는 현명한 쉘 (zsh, yash, fish, csh, tcsh, rc, es ...)과 0ksh 및 bash에서 시작합니다. 모든 Bourne 형 쉘에 이식 가능한 솔루션의 경우 set -- *; printf '%s\n' "$2"대신 다음을 사용할 수 있습니다 .
Stéphane Chazelas

@ StéphaneChazelas이 질문에 대해 최소한 태그에 "bash"가 포함되어 있으므로이 답변은 해당 셸에만 해당됩니다.
Chris Down

ls -C | awk '{print $ 1}은 같은 결과를냅니다 ... 왜 $ 2입니까?
boctulus

7

출력이 터미널이 아닌 경우 단일 열 모드 -Cls사용 하여 추가해야합니다 . awk그런 다음 두 번째 열을 인쇄합니다.

ls -C | awk '{print $2}'

2

나는 당신이 찾고 있다고 생각

ls -1

권한, 소유자, 그룹, 날짜, 크기 ...가 아니라 단일 파일에 간단한 파일 이름이 표시됩니다.


1
이 답변은 틀렸을뿐만 아니라 이전에 주어졌습니다.
스콧

나는 이것이 원래의 질문에 잘못되었다는 것을 알고 있지만 그것이 내가 찾던 것입니다. 감사합니다
AntumDeluge


0

이미 언급했듯이- 파일 이름 길이와 터미널 너비에 따라 줄을 나누기 ls때문에 구문 분석 출력에 열을 사용하는 것은 그리 강력하지 않습니다 ls. 요소 목록의 단일 열을 표시하는 것이 종종 흥미 롭습니다. cut 명령을 사용하여이를 수행 할 수 있습니다.

echo file1 file2 file3 file4 | cut -d" "  -f2

표시됩니다

file2

참고 -d로 예를 들어 그래서, 당신은 열 구분 기호를 선택할 수 있습니다

cur -d, -f2

쉼표로 구분 된 목록의 두 번째 열을 표시 할 수 있습니다.


0

현재 경로에서 특정 파일 이름 만 표시하려는 경우 아래 명령을 사용하십시오

명령:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

파싱 ls -C은 다음에 의존 하기 때문에 까다 롭습니다 .

  1. 파일 이름 길이 (자체로 전달 된 지정된 파일 목록에 따라 다름 ls -C)
  2. 터미널 폭.
  3. 사실 ls -C출력 주상이지만, 필드 분리로 공간의 번호를 변경하도록 구성 될 수도있다.
  4. 파일 이름에 공백이있을 가능성 (표시는 ls선택한 특정 표시 옵션에 따라 다름 )

지금 들어, 쉬운 문제부터 시작하자 ( 즉, 위의하지 # 4), 가 없다는 것을 파일 이름에는 공백이 . 열 # 2를 인쇄하려면 다음과 같이 작동하십시오.

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

그것을 풀기 :

  • COLUMNS=$COLUMNS공급되는 컬럼 길이 | 가 현재 터미널 디스플레이와 일관성 을 유지 하도록 보장합니다 . 임의의 값이 변경도 작동하므로 COLUMNS=50또는 COLUMNS=70 원인이 ls -C그 폭에 따라 일을 다시 정렬 할 수 있습니다.

    다른 방법은 -w스위치 를 사용하는 것입니다 . :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • tr필드 구분 기호를 일관성있게 만듭니다 . 각 열 사이에 단일 이 있습니다.

  • cut 원하는 열을 출력합니다.


공백 방법 보류 중 ...
agc

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

필요에 따라 문자 수 (54)를 변경하여 원하는 데이터 만 가져 오십시오.


2
명확히하기 위해, 54-위치 54에서 시작하는 모든 문자를 잘라냅니다; "인간 인식"열에서 멈추지 않습니다
Jeff Schaller

나쁜 생각이 아닙니다. 개선해야합니다.
prusswan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.