ls로 파일 형식을 표시하려면 어떻게합니까?


12

ls파일 유형 열을 표시 할 수 있는지 여부 는 알 수 없습니다.

빠른 온라인 검색 및 검색으로 man이러한 기능이 밝혀지지 않았습니다. 이 작업을 수행 할 수 있습니까?

설명 : 파일 확장자가없는 경우 특히 유용합니다.

최신 정보

2018-04-28 기준으로 답변은 매우 흥미 롭지 만 내가 찾고있는 것을 제공하지 않았습니다. 더 구체적으로,

  • file실제 파일 형식을 제공하지만와 잘 통합되지 않습니다 ls. 구체적으로는ls -lhtrpG --group-directories-first --color=always

  • ls -F이다 ls그렇지 실제 파일 형식의 열을 심볼들을 제공하지만 용액.

이런 이유로 나는 어떤 대답도 내가 찾고있는 대답으로 표시하지 않았습니다.



관련 정보 : 사람이 읽을 수에 대한 ls -lahtrpF --group-directories-first --color=always /dev또는 ls -lsahG /dev, 및 프로그램 읽기에 대한 ls -lsa /dev. 자세한 내용은 man ls설명서를 참조하십시오.
user1742529

답변:


16

file원하는 파일 형식 정보를 얻는 올바른 선택입니다. 출력을 결합 ls하여 사용하는 것이 좋습니다 find.

find -maxdepth 1 -type f -ls -exec file -b {} \;

이것은 현재 디렉토리에있는 모든 파일을 찾아 출력 인쇄 ls -dils뿐만 아니라의 출력 file -b자책골 행에 대한 각을. 출력 예 :

  2757145      4 -rw-rw-r--   1 dessert dessert      914 Apr 26 14:02 ./some.html
HTML document, ASCII text
  2757135      4 -rw-rw-r--   1 dessert dessert      201 Apr 13 15:26 ./a_text_file
UTF-8 Unicode text, with CRLF, LF line terminators

그러나 파일 유형 줄이 아니라 파일 유형 을 원하므로 줄 사이에 줄 바꿈 문자를 제거하는 방법이 있습니다.

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {}" \;

샘플 출력 :

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document, ASCII text
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text, with CRLF, LF line terminators

새 열은 매우 길기 때문에 첫 번째 쉼표에서 모든 것을 자릅니다.

find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '\n' '\t'; file -b {} | cut -d, -f1" \;

그 결과는 다음과 같습니다.

-rw-rw-r-- 1 dessert dessert 914 Apr 26 14:02 ./some.html    HTML document
-rw-rw-r-- 1 dessert dessert 201 Apr 13 15:26 ./a_text_file  UTF-8 Unicode text

이것은 매우 편리하지 않으므로 어떻 alias습니까? ~/.bash_aliases파일에 다음 줄 lsf을 사용하면 현재 디렉토리에 대한 위의 출력을 얻기 위해 실행해야합니다 .

alias lsf='find -maxdepth 1 -type f -exec sh -c "ls -l {} | tr '"'\n'"' '"'\t'"'; file -b {} | cut -d, -f1" \;'

1
당신이 별칭 대신 함수를 사용하는 경우, 그 적은 인용 지옥이 될 것입니다, 당신이 사용하는 경우 paste또는 column, 당신은 더 나은 정렬을 얻을 수 : lsf () { find -maxdepth 1 -type f -exec bash -c 'column <(ls -l "$@") <(file -b "$@" | cut -d, -f1)' _ {} + ; }정렬 문제 때문에 비슷한 크기와 날짜의 대답에서 분명하지 않다. (이 명령은 파일 당 한 번이 아니라 적은 횟수로 호출되기 때문에 약간 더 빠릅니다.)
muru

@muru 많은 좋은 제안에 감사드립니다! 이 columnaproach가 당신을 위해 작동 합니까 ? 그것은 단지의 출력 인쇄 ls -l모든 파일은 다음에 대한 file쉘 그냥 할 것처럼, 나를 위해 모든 파일에 대해 출력의를 ls -l "$@"; file -b "$@" | cut -d, -f1...
디저트

그렇습니다. paste.ubuntu.com/p/KjPthXPDPb- 상단 부분은 별칭에서 시작하고 하단 부분은에서 실행되는 함수입니다 /etc.
muru

문제가 있다고 생각합니다. column출력이 터미널에없는 경우 열 수를 지정해야합니다. 그렇지 않으면 파일이 차례로 출력됩니다. 그래서 column -c "$COLUMNS" ...어느 경우에 작동합니다.
muru

각 파일에 대해 5 개 이상의 프로세스를 시작하므로 디렉토리에 많은 파일이있을 경우 속도가 느려질 수 있습니다.
JanC

10

파일 형식을 표시하는 가장 좋은 방법은 다음 명령을 사용하는 것입니다.

file <filename>

디렉토리의 모든 파일 유형을 나열하려면 다음을 사용하십시오.

file *

내 컴퓨터에서 <code> 파일 * </ code> 샘플

인수에 대한 자세한 내용은 다음을 참조하십시오.

man file

이 답변은 OP의 질문에 직접 응답하지 않지만 파일의 MIME 유형을 찾는 올바른 방법을 보여 주므로 정답으로 표시해야합니다. mime type유일한 것을 얻으려면 다음을 사용하십시오 file --mime-type filename..
Pedro Lobito

@PedroLobito 밀접하게 관련된 질문file꽤 잘 다루고 있지만이 질문은 다릅니다.
디저트

귀하가 가장 먼저 답변을 제공 한 것을 감안하여이 답변에 투표합니다 file. 내가 다른 사람들에게 대답했을 때 이것으로 충분하지 않으므로 (ls와 통합해야 함) 투표를 계속합니다. 감사합니다.
user10853

1
파일 *는 최고의 답변입니다
tramada

1
file --mime /dev/*현재 디렉토리 대신 / dev 디렉토리에있는
mime

7

명확히하기 위해 파일 형식 에 따라 파일 이름에 기호를 추가하는 플래그 (classify)를 ls사용하여 기본 의미에서 파일 형식 을 볼 수 있음을 지적 -F합니다.

‘-F’
‘--classify’
‘--indicator-style=classify’
     Append a character to each file name indicating the file type.
     Also, for regular files that are executable, append ‘*’.  The file
     type indicators are ‘/’ for directories, ‘@’ for symbolic links,
     ‘|’ for FIFOs, ‘=’ for sockets, ‘>’ for doors, and nothing for
     regular files.

ls -l그러나 출력의 첫 글자에 약간 덜 암호 적으로 표시되는 정보를 볼 수 있습니다 . wjandrea의 답변 은 이것을 자세히 설명합니다.

그러나 이것이 파일 유형의 의미라고 생각하지 않습니다. 이 ls명령은 파일 이름을 저장하는 디렉토리 목록과 앞서 언급 한 의미에서 "유형"을 포함하는 메타 데이터를 저장하는 디렉토리 목록에서만 일반 파일을 찾지 않습니다.

따라서이 ls명령은 정보가 없기 때문에 JPG 이미지인지 바이너리 파일인지 텍스트 파일인지 LibreOffice 문서인지에 따라 파일 형식을 표시 할 수 없습니다.

이를 위해 singrium의 답변 에서 알 수 있듯이file 명령 유형 이 필요합니다.이 명령은 파일의 내용을 처음 50-100kB 정도 정도 확인하여 유형을 결정합니다.


@Zana이 깃발에 관심을 가져 주셔서 감사합니다. 이것은 내가 찾고있는 것이 아니지만 (실제 파일 유형) 지금은 그렇게 할 것입니다. 이를 위해 투표하겠습니다.
user10853

3

파일 형식의 한 가지 형식은 파일이 일반 파일인지, 디렉토리, 장치, symlink 등 ls이 옵션 -l또는을 사용하여이를 표시 할 수 있는지 여부 -F입니다.

  • 옵션 -l은 목록 시작시 파일 유형을 단일 문자로 표시합니다 (예 :

    $ ls -l
    drwxrwxr-x 2 user user 4096 Dec 11 00:18 DIR
    -rw-rw-r-- 1 user user    0 Dec 11 00:18 FILE
    lrwxrwxrwx 1 user user    4 Dec 11 00:19 LINK -> FILE
    

    경우 -일반 파일, d디렉토리, 그리고 l심볼릭 링크입니다.

  • 옵션 -F은 파일 형식을 접미사로 표시합니다. 예 :

    $ ls -F
    DIR/ FILE LINK@
    

    정규 파일이 아닌 접미사가없는 /경우 디렉토리이며 @심볼릭 링크입니다.

이에 대한 자세한 정보는에서 info coreutils 'ls invocation'요약되어 있습니다.

의 경우 -l:

‘-’ regular file
‘b’ block special file
‘c’ character special file
‘C’ high performance (“contiguous data”) file
‘d’ directory
‘D’ door (Solaris 2.5 and up)
‘l’ symbolic link
‘M’ off-line (“migrated”) file (Cray DMF)
‘n’ network special file (HP-UX)
‘p’ FIFO (named pipe)
‘P’ port (Solaris 10 and up)
‘s’ socket
‘?’ some other file type

의 경우 -F:

nothing for regular files
‘*’ regular files that are executable
‘/’ directories
‘@’ symbolic links
‘|’ FIFOs
‘=’ sockets
‘>’ doors
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.