1. 概要

特定のファイルタイプがディレクトリに存在するかどうかを確認したい場合があります。 たとえば、ディレクトリにPNG画像があるかどうかを確認したい場合があります。 これにより、指定した保存場所にあるすべてのPNGファイルを収集できます。

このチュートリアルでは、ディレクトリ内のファイルの種類を確認するさまざまな方法について説明します。

2. ディレクトリの例

このチュートリアルの例では、次の内容のdirectoryという名前のディレクトリを使用しています。

$ ls -1 directory/
handlers.py
hello2.sh
hello-world.sh
images
project_source_code.zip
python_code.py
ReactART.js

3. lsでファイルタイプを確認する

多くの場合、ファイルの種類は拡張子を見て判別します。 このアプローチを使用すると、 lsコマンドを使用して、特定のファイルタイプのすべてのファイルを一覧表示できます。

$ ls directory/*zip
directory/project_source_code.zip

しかし、ファイルが偽の拡張子で非表示になる可能性があることは誰もが知っています。 たとえば、ZIPファイルの拡張子は.txtになります。

$ mv directory/project_source_code.zip directory/project_source_code.txt
$ ls directory/*txt
directory/project_source_code.txt

ただし、拡張子に基づいてファイルの種類を確認することは合理的なアプローチです。 後で、拡張子ではなくコンテンツに基づいてファイルのファイルタイプを確認する方法について説明します。

ディレクトリファイルタイプを確認したい場合はどうなりますか? 通常、ディレクトリには拡張子がありません。 引数には-dフラグと*/を使用できます。

$ ls -d directory/*/
directory/images/  directory/python_code.py/

-d フラグはディレクトリのみをリストし、引数の * / は、末尾にスラッシュ/が付いているすべてを意味します。

4. findでファイルタイプを確認する

find コマンドを使用して、基準に基づいてファイルを検索できます。 このコマンドは、 -name オプションを介して、拡張子に基づいてファイルをフィルタリングできます。

$ find directory -name "*.js"
directory/ReactART.js

アスタリスクがあるため、パターンを二重引用符で囲む必要があることに注意してください。 このパターンは、.jsで終わるすべてのものを意味します。

-typeオプションを使用してディレクトリをフィルタリングすることもできます。

$ find directory/* -type d
directory/images
directory/python_code.py

5. ファイルでファイルタイプを確認する

file コマンドは、ファイルのファイルタイプをその内容に基づいてチェックします。

$ file directory/handlers.py 
directory/handlers.py: Python script, ASCII text executable

このPythonスクリプトに偽の拡張機能を与えることはできますが、fileコマンドはそれを見通すことができます。

$ mv directory/handlers.py directory/handlers.zip
$ file directory/handlers.zip
directory/handlers.zip: Python script, ASCII text executable

file コマンドは、複数の引数とパターンを受け入れることができます。

$ file directory/handlers.py directory/hello-world.sh 
directory/handlers.py:    Python script, ASCII text executable
directory/hello-world.sh: Bourne-Again shell script, ASCII text executable
$ file directory/*py
directory/handlers.py:    Python script, ASCII text executable
directory/python_code.py: directory

ただし、fileコマンドは完全ではありません。 正しいファイルタイプを推測できない場合があります

$ head directory/ReactART.js
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import * as React from 'react';
import ReactVersion from 'shared/ReactVersion';
import {LegacyRoot} from 'react-reconciler/src/ReactRootTags';

$ file directory/ReactART.js 
directory/ReactART.js: C++ source, ASCII text

file コマンドは、ReactART.jsのファイルタイプを推測できませんでした。 C ++ソースではなく、JavaScriptソースである必要があります。

file コマンドでファイルをフィルタリングするには、awkコマンドおよびgrepコマンドと組み合わせます。 たくさんのファイルがあり、Pythonスクリプトがあるかどうかを確認したいとします。 fileコマンドの出力をawkおよびgrepコマンドで分割できます。

$ file directory/* | awk -F':' '{print $2}' | awk '{$1=$1};1'
directory
Python script, ASCII text executable
Bourne-Again shell script, ASCII text executable
Bourne-Again shell script, ASCII text executable
directory
Zip archive data, at least v1.0 to extract
directory
C++ source, ASCII text
$ file directory/* | awk -F':' '{print $2}' | awk '{$1=$1};1' | grep "Python script"
Python script, ASCII text executable

-F フラグは、区切り文字を選択するためのものです。 中括弧付きの文字列の$2 は、分離された出力文字列の2番目の列です。 最後のawkコマンドは、出力の先頭のスペースをトリミングすることです。

もちろん、awkコマンドを使用する必要はありません。

$ file directory/* | grep "Python script"
directory/handlers.py:             Python script, ASCII text executable

ファイル名に「Pythonscript」が含まれるファイルがないことを確認する必要があります。

6. Bashスクリプトを使用したファイルタイプの確認

Bashは、ディレクトリ内のファイルタイプのチェックをサポートしています。 ifステートメント -e、-d、および-fフラグを使用できます。

$ cat check-file-type.sh
#!/bin/bash

if [ -e directory/*.js ]; then
  echo "There are JavaScript files or directories with .js extension inside 'directory'"
fi

if [ -d directory/ ]; then
  echo "'directory' is a directory"
fi

if [ -f directory/*.js ]; then
  echo "There are JavaScript files (not directories with .js extension) inside ‘directory’"
fi

$ ./check-file-type.sh
There are JavaScript files or directories with .js extension inside 'directory'
'directory' is a directory
There are JavaScript files (not directories with .js extension) inside 'directory'

-e フラグは、ファイルまたはディレクトリが存在するかどうかを確認するためのものです。 -f フラグは、通常のファイル(ディレクトリではない)が存在するかどうかを確認するためのものです。 最後に、 -d フラグは、これがディレクトリであるかどうかをチェックするためのものです。 このフラグはワイルドカード引数を受け入れることができません。

7. 結論

この記事では、ディレクトリ内のファイルタイプをチェックするさまざまな方法を見ました。 lsfindなどの一部のツールは、ファイル名を使用してファイルタイプをチェックします。 file のような別のツールは、ファイルの内容を使用してファイルタイプをチェックします。

まず、lsコマンドを使用しました。 次に、findコマンドを使用しました。 次に、fileコマンドを使用しました。 最後に、ファイルとディレクトリの存在をチェックし、それらのタイプをチェックするための組み込みフラグのいくつかを使用して、bashスクリプトを作成しました。