ls
がファイルタイプの列を表示できるかどうかについて私は知らない。
クイックオンライン検索を実行してman
を検索しても、そのような機能は明らかになりませんでした。これは可能ですか?
明確化:これは、ファイルに拡張子がない場合に特に役立ちます。
更新
2018-04-28現在、回答は非常に興味深いものでしたが、私が探していたものを提供しませんでした。すなわち、
file
は実際のファイルタイプを提供しますが、ls
とはうまく統合されません。具体的には、ls -lhtrpG --group-directories-first --color=always
を使用します
ls -F
はls
ソリューションですが、実際のファイルタイプの列ではなくシンボルを提供します。
この理由で、私は探している答えとして答えをマークしていません。
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
しかし、ファイルタイプlineではなく、ファイルタイプcolumnが必要なので、行間の改行文字を削除する方法を次に示します。
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" \;'
わかりやすくするために、シンボルを追加する-F
フラグ(分類)を使用して、ls
を使用して基本的な意味で ファイルタイプ を表示できることを指摘します。タイプに応じたファイル名へ:
‘-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's answer は、これをより詳細に説明しています。
しかし、これはあなたがファイルの種類によって意味するものだとは思いません。 ls
コマンドは、通常のファイル内ではなく、ディレクトリリスト(ファイル名を格納する)とiノード(前述の意味での「タイプ」を含むメタデータを格納する)のみを検索します。
そのため、ls
コマンドは、JPGイメージかバイナリファイルか、テキストファイルか、何らかのLibreOfficeドキュメントかという意味では、ファイルタイプを表示できません。これは、その情報がないためです。
そのためには、 singriumの答え が指摘するように、file
コマンドが必要です。このコマンドは、ファイルのコンテンツの最初の50-100kB程度を見て、タイプを決定します。
ファイルタイプの1つの形式は、ファイルが通常のファイル、ディレクトリ、デバイス、シンボリックリンクなどであるかどうかです。ls
は、オプション-l
または-F
を使用してこれを表示できます。
オプション-l
は、リストの最初にファイルタイプを1文字として表示します。例:
$ 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