나는 ls를 사용하여 디렉토리의 파일을 나열하고 다른 옵션을 전달하려고 했습니다.
파일 형식을 나열하는 기능도 있나요? 개별 파일에 대해 file 명령을 실행하지 않고 실행 파일, 공유 라이브러리 파일 또는 ASCII 파일이 무엇인지 알고 싶습니다.
답변1
ls
이 정보는 그 자체로 표시되지 않습니다.
find
다음 과 같이 출력을 파이프할 수 있습니다 file -f -
.
$ find /usr/local/bin | file -f -
/usr/local/bin: directory
/usr/local/bin/apt: Python script, ASCII text executable
/usr/local/bin/mint-md5sum: ASCII text
/usr/local/bin/search: Bourne-Again shell script, ASCII text executable
/usr/local/bin/gnome-help: Python script, ASCII text executable
/usr/local/bin/office-vb.sh: ASCII text
/usr/local/bin/pastebin: Python script, ASCII text executable
/usr/local/bin/highlight: POSIX shell script, ASCII text executable
/usr/local/bin/yelp: Python script, ASCII text executable
전체 경로와 파일 이름만 인쇄하므로 find
대신 사용하십시오 . 따라서 현재 디렉터리의 파일에 대해서만 이 작업을 수행해야 하는 경우 다음을 수행하세요.ls
ls
ls | file -f -
작동합니다.
답변2
ls
이러지 마세요. 그 임무는 파일 콘텐츠가 아닌 파일 메타데이터(권한, 타임스탬프 등)를 보고하는 것입니다. 하지만 file
이 작업은 자체적으로 수행됩니다(모든 파일을 나열하기 위해 셸 와일드카드와 결합).
file *
현재 디렉토리의 경우 또는
file /some/directory/*
다른 디렉토리에.
메타데이터와 파일 콘텐츠 정보를 결합하려는 경우 ls
합계 출력을 결합할 수 있습니다 file
. 한 가지 접근 방식은 두 명령을 배열하여 한 줄에 하나의 파일을 동일한 순서로 나열하고 다음을 사용하는 것입니다.paste
이들을 결합하는 유틸리티 - 다음과 같습니다.
paste <(ls -dlog -- *) <(file -b -- *)
(이것은 일반적인 대화형 셸인 bash, zsh 및 ksh93에서 사용할 수 있는 프로세스 대체를 사용합니다.)column
열을 정렬하는 편리한 방법인 유틸리티:
paste <(ls -dlog -- *) <(file -b -- *) | column -ts $'\t'
필드를 다른 순서로 출력하려면,join
오히려 파일 이름에 대한 필드입니다. 공백이 포함된 파일 이름을 처리하고 수직으로 정렬된 결과를 생성하기 위해 공백과 탭 사이를 왔다 갔다 했습니다.
join -t $'\t' -1 2 -2 1 <(ls -dlog -- * |
sed 's/^\([^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]*\) */\1\t/') \
<(file -- * | sed 's/: */\t/') |
column -ts $'\t'