-1

ディレクトリ内の最も古いファイルの経過時間を計算するスクリプトを作成しています。最初に実行されるコマンドは次のとおりです。

OLDFILE=`ls -lt $DIR | grep "^-" | tail -1 `    
echo $OLDFILE

出力には、ファイル名だけではありません。例えば

-rwxrwxr-- 1 abc abc 334 May 10 2011 ABCD_xyz20110510113817046.abc.bak

Q1/. 上記の行の最後のスペースの後に出力を取得するにはどうすればよいですか? これでファイル名がわかります。ある種の文字列操作が必要であることは認識していますが、シェルスクリプトは初めてです。

Q2/. このファイルの経過時間を分単位で取得するにはどうすればよいですか?

4

4 に答える 4

1

最も古いファイルの名前だけを取得するには、

ls -lt | awk '/^-/{file=$NF}END{print file}'

ただし、名前にスペースが含まれるファイルなどがある場合、これは堅牢ではありません。一般に、からの出力を解析しないようlsにする必要があります。

を使用statすると、1970 年 1 月 1 日からの秒数で表される、機械可読形式でファイルの作成日を取得できます。を使用date +%sすると、同じ形式で現在の時刻を取得できます。引き算して 60 で割ります。

最後に、代替ソリューションについては、のオプションを見てくださいfind。特に、printfフォーマット文字列を使用すると、ファイルの経過時間を抽出できます。以下は、最も古いファイルの経過時間 (秒) と inode 番号を直接取得します。

find . -maxdepth 1 -type f -printf '%T@ %i\n' |
sort -n | head -n 1

inode 番号を使用すると、変なファイル名の問題を回避できます。単一の inode があれば、それをファイル名に変換するのは簡単です。

find . -maxdepth 1 -inum "$number"

2 つを結び付けると、次のようなものが必要になる場合があります。

# set -- Replace $@ with output from command
set -- $(find . -maxdepth 1 -type f -printf '%T@ %i\n' |
         sort -n | head -n 1)
# now $1 is the timestamp and $2 is the inode

oldest_filename=$(find . -maxdepth 1 -inum "$2")
age_in_minutes=$(date +%s | awk -v d="$1" '{ print ($1 - d) / 60 }')
于 2013-05-21T04:57:27.763 に答える