2016-08-17 3 views
0

私は、bourneシェルスクリプトを使い、ディレクトリとファイルという2つのコマンドライン引数を取るスクリプトを作成しようとしています。私は、ファイルの作成日をディレクトリ内のものと比較して古いファイルをすべて印刷し、新しいファイルをすべて数えたいとします。作成日に基づいたファイルリストの返信

これは私がこれまで試みたコードですが、ディレクトリが正しく認識されていないことがわかります。

#!/bin/sh 

directory=$1 
file=$2 
x=0 

for f in $directory 
do 
    if [ $f -ot $file ] 
    then 
    echo "$f" 
    x='expr $x+1' 
    fi 
done 

echo "There are $x newer files" 

どのようなヒントをいただければ幸いですか? ありがとう

+1

ステップ1では、ファイル作成日を実際に保存するファイルシステムを使用していることが確認されます。ほとんどはしません。 'ctime'は「作成時刻」ではなく「変更時刻」であり、そのタイムスタンプを修正する作成後のアクティビティがあります。 – twalberg

答えて

1

findコマンドは、タイムスタンプに基づいてファイルを検索するオプションを提供します。何を達成したいがループを使用せずに行うことができます。

# Search for files with modification time newer than that of $file 
find $directory -newermm $file 

# Search for files with modification time older than that of $file 
find $directory ! -newermm $file 

詳細はhttps://www.gnu.org/software/findutils/manual/html_node/find_html/Comparing-Timestamps.htmlを参照してください。ディレクトリ内のファイルを反復処理するために

  1. 、あなたが使用することができます:しかし

    、あなたはここで、シェルスクリプトを学習し、独自のスクリプトを記述したい場合は、いくつかの提案です

    for f in "$directory"/* 
    
  2. 私が知る限り、-otは変更時刻(および作成時刻ではない)を比較します。その点について、Linuxがファイルの作成時間を提供するかどうかは疑問です。

  3. x(新しいファイルの数)のインクリメントはelse句で行う必要があります。すべてのPOSIX準拠のシェルでサポートされているx=$((x+1))が好きです。

  4. 警告:"$directory/*を使用して反復することは、サブディレクトリに繰り返されません。 findは、-maxdepthオプションを指定しない限り、サブディレクトリに再帰します。

+0

私のためにこれを明確にするためにヒープをありがとう。 findと同じようにする方法があるのか​​知っていますが、それぞれを出力するのではなく、ファイルを数えますか? – Brittany

関連する問題