各サブフォルダの最新ファイルを一覧表示

各サブフォルダの最新ファイルを一覧表示

私のファイル構造は次のとおりです

FOLDER/SUB_FOLDER/Text_File

私はそれらのうちの1,000以上を持っておりFOLDER、それぞれは少なくともFOLDER2つの異なるものを持っています。SUB_FOLDERSUB_FOLDERText_File

私は一番多くのリストを作るために自分自身に挑戦しようとしています。最近 Text_FileFOLDER/(ルート)

My Pseudo code is (as well as commands I know right now): 
List all FOLDERS
 - **ls -t [EACH_FOLDER] | head -n1 **
    **ls -t EACH_FOLDER/SUB_FOLDER/**
      **ls Text_File**

出力は次のようになります。

/FOLDER/SUB_FOLDER/Text_File

...

すべてのファイル。

私の目標は、すべてのルートディレクトリのすべての最新のText_FileをgrepしてFOLDER情報を解析することです。

答え1

#!/bin/bash

# Array of root folders
folders=("a" "b")

# Search all specified root folders
for f in ${folders[@]}; do
    # Descend hierarchy and retrieve modification date of each file with "stat"
    find $f -type f -exec stat -f "%m,%N" {} ';' | \
        # sort by date, most recent first
        sort -gr | \
        # extract first (most recent) file
        head -1 | \
        # return file name only
        cut -d, -f2
done

答え2

あなたはgnu試すことができます:

find "$(pwd)" -mindepth 2 -maxdepth 2 -type d -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
  /^d/ {directoryname=substr($0,2)}
  /^[0-9]/ && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
    lmtimes[directoryname]=$1;
    lmtimedns[directoryname]=substr($0,index($0," ")+1);
  }
  END {for (directoryname in lmtimedns) print lmtimedns[directoryname]}
  '

\n "このバージョンは、特殊文字などを含む奇妙な名前に対してテストされました。

$(pwd)pwd現在のディレクトリの絶対パス名を印刷するコマンドを実行します。

find $(pwd)現在のディレクトリを検索すると、完全なディレクトリパス名が印刷されます。

フィルタは、現在のディレクトリのレベルが1でレベル2の2-mindepth 2 -maxdepth 2 -type d番目のレベルのディレクトリのみを選択します。FOLDERSUB_FOLDER

-printf "d%h\0%T@ %p\0"見つかった各SUBFOLDERメッセージを次のように印刷します。

d FOLDER \0 last modif time in second since EPOCH [space] SUBFOLDER \0など。

\0名前の一部にすることはできないので、これは完璧な区切り記号です。

awk -v RS="\0"\0記録区切りとして考慮しています。

/^d/ {directoryname=substr($0,2)}regexレコードが;で始まるd場合に該当します。directoryname変数は、生成によって文字FOLDERの後に続くすべての文字で構成される名前で更新されます。dprintf

/^[0-9]/regexレコードが数字で始まる場合に該当します。構成によると、printf現在のレコードの最初のフィールド($1例えば、[space]文字までのすべての文字)には、最後の変更時刻が含まれます。

&& (!lmtimes[directoryname] || lmtimes[directoryname] < $1):連帯連想配列([キー、値]ペアのマップ)です。SUBFOLDERCurrent FOLDERdirectoryname)現在の最近の最後の変更時刻を保存するために使用されます。true最後の修正時刻が保存されていないdirectorynameか、最後の修正時刻が現在時刻より前に保存されたかを示しますSUBFOLDER

次の式がtrueの場合、最後の変更時刻と名前はキーをFOLDER使用してdirectoryname保存されます。連帯そしてリアルタイムドメインネームシステム、それぞれ。

END {for (...:すべての履歴が解析されたら、SUBFOLDER最後に変更された時刻とともに各名前を印刷します。

----

履歴の場合、このコマンドは各ディレクトリに対して最後に変更されたファイル名を一覧表示します。

 find "$(pwd)" -depth -type f -printf "d%h\0%T@ %p\0" | awk -v RS="\0" '
  /^d/ {
    directoryname=substr($0,2);
  }
  /^[0-9]/ {
    if (!lmtimes[directoryname] || lmtimes[directoryname] < $1) {
      lmtimes[directoryname]=$1;
      lmtimefns[directoryname]=substr($0,index($0," ")+1);
    }
  }
  END {
    for (directoryname in lmtimefns) {
      print lmtimefns[directoryname];
    }
  }'

関連情報