`ls -l`의 출력에서 ​​필드 / 열을 어떻게 선택합니까?


22

나의 목표는 기만적으로 단순하다 (적어도 나에게는). 나는의 출력을 가지고하고자하는 ls -l또는 ls -lh그냥 하나의 필드를 선택합니다.

필자는 파일 이름이 가변 수의 공백을 가질 수 있다고 가정합니다. 즉, 필드의 모든 길이가 같은 것은 아닙니다.

필드 이름 (또는 필드 번호)을 가져 와서 필드의 내용을 반환하는 스크립트를 갖는 보너스 포인트.

나는 돌아가고 싶어

여기에 이미지 설명을 입력하십시오

으로:

여기에 이미지 설명을 입력하십시오

답변:


41

시도하십시오 ls -l | awk '{print $7}'.

awk 열을 선택하여이 작업에 적합합니다.


3
@ormaaj가 설명했듯이 : 특정 위치에서 사용할 수있는 정보에 의존하지 마십시오 ls. 이 find명령은 대단히 도움이됩니다.
Paddy Landau

@PaddyLandau find 명령을 사용하여 파일 크기를 메가 바이트 단위로 인쇄하려면 어떻게해야 ls -l --block-size=M합니까?
SurpriseDog

@Benjamin —이 ls명령은 POSIX 표준이 아니므로 의존하는 스크립트가 ls다른 시스템에서 또는 시간이 지남에 따라 중단 될 수 있습니다. 자세한 내용은이 페이지의 @ormaaj의 답변을 참조하십시오. 요청한 것을 수행하는 한 가지 방법은 Bash 루프를 사용하는 것입니다. 다음은 예입니다. for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done. 물론, 대신 echo처리를 사용합니다.
패디 랜도

@PaddyLandau 방금 find 명령의 출력을 파이핑으로 끝냈습니다 ... | xargs -d '\n' du -m.
SurpriseDog

@Benjamin의 -exec옵션 을보고 싶을 수도 있습니다 find.
패디 랜도

17

ls 구문 분석하지 마십시오 . GNU를 사용하십시오 find. 또는 이식성이 중요하지 않은 경우 stat(1).

find . -maxdepth 1 -printf '%Td\n'

파일 이름 목록 이외의 데이터를 한 줄씩 읽고 필드로 나누려면 BashFAQ / 001을 참조하십시오.

대부분의 환경에서 적합한 줄 바꾸기로 구분 된 파일 이름 목록을 안정적으로 읽는 방법은 없습니다.


1

쉘에서 특정 열을 가져올 수 있습니다 :

ls -al | while read perm bsize user group size month day time file; do echo $day; done

awk같이 @Corey 응답 , cut -c44-45(이후도 조정 후 일하는 것이 ls열을 고정하고있다), 또는 어떤 다른, 그러나 가장 큰 문제는되지 않을 것입니다 (예를 들어 유닉스에있을 수 있습니다 신뢰할 수 있고 방탄 $6,하지 $7, 그것을 기계 친화적이지 않기 때문에 명령 을 구문 분석하지 않는 것이 좋습니다ls .

가장은 다음과 같은 가능한 다른 명령을 사용하는 것입니다 find또는 stat당신이 필요로 출력을 포맷 관련 옵션을 제공 할 수 있습니다. 예를 들면 다음과 같습니다.

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

며칠 동안 수정 한 열만 반환하려면 다음 예제를 시도하십시오.

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

GNU stat는 BSD에 대해 다른 옵션을 가질 수 stat있으므로 다른 운영 체제에서 여전히 방탄하지는 않습니다.


1
ls를 사용하거나 구문 분석해서는 안된다는 언급에 +1 stat. date그러나 잘못 설정되었습니다. 자체적으로 현재 날짜를 인쇄하기 --date=$ymddate
때문에을

ls -la | cut -c32-33는 사용자 이름 '길이와 파일에'에 크기에 의존하기 때문에 총 정직의 명령뿐만 아니라 때문에 이름을 가진 가능한 함정, 단지 완전히 신뢰할 수없는, 단순히. stat -c "%x" *.*명령은 좋아 보이지만, 사용하여 *.*만 점을 포함하는 파일 이름에 restricing하고 있습니다. 나는 그 의도가 숨겨진 파일도 잡는 것 같아; 이 경우에는 사전에 dotfiles에 대한 글 로빙 활성화해야 사용이 *대신 *.*: shopt -s dotglob; stat -c "%x" * | [...].
kos

Ah와 Serg가 말한 내용 --date="$ymd"에 따라 date명령에 추가해야합니다 . 그렇지 않으면 해당 월의 현재 날짜가 인쇄됩니다.
kos

의견 주셔서 감사합니다. 문제를 해결하고 더 나은 초기 예를 제공했습니다.
kenorb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.