1. 概要

このチュートリアルでは、ディレクトリ内のファイルをカウントするbashスクリプトを作成し、特定の数よりも多くのファイルがある場合は、最も古いファイルを削除します。

2. 環境

複数のファイルを含むディレクトリがあるとしましょう。

$ ls 
files
$ ls -t ./files
file15.txt  file13.txt  file11.txt  file9.txt  file7.txt  file5.txt  file3.txt  file1.txt
file14.txt  file12.txt  file10.txt  file8.txt  file6.txt  file4.txt  file2.txt

-t オプションは、報告されたファイルを変更時刻でソートするため、最新のファイルが最初に表示されます。 ご覧のとおり、 file15.txt が最新のファイルで、file1.txtが最も古いファイルです。

3. スクリプト

それでは、スクリプトを作成しましょう。 引数としてファイル数の制限を受け取る必要があります。

#!/bin/bash

# Print usage if requested.
if [[ $1 == "--help" || $1 == "-h" ]]
then
    echo "Usage: $0 [files limit]"
    exit 0
fi

# The script receives the limit as an argument.
limit=$1

number_of_files=$(ls ./files | wc -l)

if [ $number_of_files -gt $limit ]
then
    # There are more files than the limit
    # So we need to remove the older ones.
    cd files
    ls -t | tail --lines=+$(expr $limit + 1) | xargs -d '\n' rm
fi

上記のコードでは、 wc -l は、改行文字 \ n を区切り文字として使用して、 ./files内のファイルをカウントします。

ls -t は、変更時刻ごとにファイルを一覧表示し、最新のファイルを最初に配置します。

tail –lines = + $(expr $ limit + 1)は、制限の直後に来るファイルを出力します。 したがって、削除する必要のあるすべてのファイルができました。

最後に、 xargs -d’\ n’は、改行文字を区切り文字として使用して、各ファイルを引数として rm に渡し、それらを削除します。

4. スクリプトの実行

スクリプトを保存した後、実行する前にスクリプトを実行可能にする必要があります。

$ ls
count_then_remove.sh  files
$ chmod u+x count_then_remove.sh

chmod u + x は、スクリプトを実行可能にします。 それを実行してみましょう:

$ ./count_then_remove.sh 5 
$ ls -t ./files
file15.txt  file14.txt  file13.txt  file12.txt  file11.txt

スクリプトが古いファイルを削除したことがわかります。 その結果、5つのファイルが残っています。

5. 結論

この短い記事では、ディレクトリ内のファイル数を所定の数以下に保つスクリプトを作成する方法を学びました。