ディレクトリ内の最新のファイルを探して、ファイルが「X」時間より古い場合にのみそのパスを印刷するコマンドまたはスクリプトを考えてみます。
これに関するアイデアは、スクリプトが「X」時間より古い場合にのみ値(最新のファイルへのパス)を返すことです。何も返さないと、最新のファイルが指定された時間より若いという意味です。
答え1
zsh
シェルでは、次のファイル名のワイルドカードパターンは非表示の名前と一致します。
*
以下は、隠されていない名前の通常のファイルと一致します。
*(.)
nullglob
のように動作させるには、bash
修飾子を追加してくださいN
。D
隠された名前を一致させるには、以下を追加することもできます(「ドットファイル」に表示されます)。
*(.ND)
mh+3
4時間以上前に変更された一般ファイルの名前のみを一致させるには、追加してください。
*(.NDmh+3)
mtimeタイムスタンプに基づいて一致する名前をソートします。
*(.NDmh+3om)
名前の選択(最も最近修正):
*(.NDmh+3om[1])
からbash
:
zsh -c 'print -rC1 some/dir/path/*(.NDmh+3om[1])'
答え2
これはstat
GNU coreutilsを使用します。
# use stat to find the mtime of the newest file
read -r age name < <(stat -c $'%Y\t%n' * | sort -nr | head -1)
# number of hours, get the limit epoch time
hrs=4
limit=$((EPOCHSECONDS - hrs * 3600))
# print the filename if it's older
((age < limit)) && echo "$name"
仮説
- あなたの$ PWDは問題のディレクトリです
- ファイル名に改行文字が含まれていません。
- あなたのbashバージョンは...最新です(EPOCHSECONDS変数がいつ導入されたのかわからない)
答え3
statを使用する別の解決策はよりきれいですが、興味深く効果的であると考えて、短い解決策を投稿することにしました。
find -maxdepth 1 -mmin -60 -type f | grep -q . || ls -tr | tail -1
これがどのように機能するかを説明するために、まず「最新ファイル」の範囲内のすべてのファイルをリストします。何も見つからないとgrep -q .
何も出力されず、実行が終了します。しかし、何も出力しないと、grepはエラーコードを返すので、or("||")は実行を引き起こし、ls -tr | tail -1
ディレクトリ内の最も古いエントリを表示します。