file コマンドを使わずに同じ結果を得る

file コマンドを使わずに同じ結果を得る

fileコマンドを使用せずにどのように実行できますか?現在のディレクトリのすべてのファイルとその種類を印刷しようとしています。

./type.bash *
Desktop (Directory) 
Documents (Directory) 
Downloads (Directory) 
Music (Directory) 
list (Ordinary file)

答え1

あなたはそれを使用することができます統計資料

$ touch regular_file
$ mkdir directory
$ stat -c %F regular_file directory/
regular empty file
directory
$
$ stat --format="%n: %F" regular_file directory
regular_file: regular empty file
directory: directory

答え2

ファイルとディレクトリを区別したいがファイル形式に興味がない場合は、以下は最小限の例です。

find . -mindepth 1 -type d -printf '%f (Directory)\n' && find . -type f -printf '%f (Ordinary file)\n'

このfindコマンドを使用すると、ディレクトリが最初にリストされ、2番目のコマンドでファイルがリストされます。最初のコマンドの目的は、現在のディレクトリ表示を-mindepth 1スキップすることです。.

なぜ発見されたのか再帰的このオプションを追加することもできます-maxdepth 1

答え3

先生が質問に表示された結果をコピーしたい場合は、次のことを行うことができます。

#!/bin/sh

for f
do
        if [ -d "$f" ]
        then
                printf '%s (%s)\n' "$f" Directory
        elif [ -f "$f" ]
        then
                printf '%s (%s)\n' "$f" 'Ordinary file'
        else
                printf '%s (%s)\n' "$f" Other
        fi
done

これは純粋なバッシュです。

外部プログラムを使用する場合は、次のことができます。

#!/bin/sh

for f
do
        case "$(ls -ld "$f")" in
           d*)
                printf '%s (%s)\n' "$f" Directory
                ;;
           -*)
                printf '%s (%s)\n' "$f" 'Ordinary file'
                ;;
           *)
                printf '%s (%s)\n' "$f" Other
        esac
done

答え4

このような質問があるときに最初にすべきことは、fileマンページ(man 1 file)を読むことです。その文書に記載されているように:

 The filesystem tests are based on examining the return from a stat(2) system
 call.  The program checks to see if the file is empty, or if it's some sort of
 special file.  Any known file types appropriate to the system you are running
 on (sockets, symbolic links, or named pipes (FIFOs) on those systems that
 implement them) are intuited if they are defined in the system header file
 <sys/stat.h>.

 The magic tests are used to check for files with data in particular fixed for‐
 mats.  The canonical example of this is a binary executable (compiled program)
 a.out file, whose format is defined in <elf.h>, <a.out.h> and possibly
 <exec.h> in the standard include directory.  These files have a “magic number”
 stored in a particular place near the beginning of the file that tells the
 UNIX operating system that the file is a binary executable, and which of sev‐
 eral types thereof.  The concept of a “magic” has been applied by extension to
 data files.  Any file with some invariant identifier at a small fixed offset
 into the file can usually be described in this way.  The information identify‐
 ing these files is read from /etc/magic and the compiled magic file
 /usr/share/misc/magic.mgc, or the files in the directory /usr/share/misc/magic
 if the compiled file does not exist.  In addition, if $HOME/.magic.mgc or
 $HOME/.magic exists, it will be used in preference to the system magic files.

fileマジックナンバーによって異なります。したがって、同等のファイルを直接実装するには、最初にstat通常のファイルであることを確認し、空でない場合はマジックナンバーを使用する必要があります。libmagicこれを行うために使用することを検討してください。

関連情報