各フォルダから最初のファイルと最後のファイルを再帰的に取得する Bash コマンド

各フォルダから最初のファイルと最後のファイルを再帰的に取得する Bash コマンド

私はディレクトリを持っています

私のメインDIRは/tmp/folder

中には/tmp/folderX個のフォルダのみ(ファイルではありません)があります。例えば

/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5

これらのフォルダー内には、同じ拡張子のファイルが多数あります。これらのフォルダーのそれぞれから、最後に作成されたファイルと最初に作成されたファイル (変更時刻) を取得したいと考えています。

私が好む出力は次のようになります

/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE

この出力はスクリプトを使用して解析しますので、必要な出力を行うことができますが、簡単に解析できるようにフレンドリーな方法で実行してください。

bashコマンドは1つだけ

答え1

find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done

または、より読みやすい形式で、デモンストレーション用に追加の変数を使用して次のようにします。

find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
    printf '%s,%s\n' "$d" "$files";
done

これは、コマンド$DIRを使用してのすべてのサブディレクトリを検索しますfind。見つかったサブディレクトリごとに、 を使用して、ls -trそのディレクトリ内のファイルのリストを日付順に新しい順に取得します。

の出力をパイプし、最初の行と最後の行をコンマで結合します。オプションはls -trデフォルトの出力を抑制し、最初の行(最新のファイル名)をsed-n1hスペースを保持する、そしてファイルの最後の行( によって選択される$)で、ホールドスペース(最新のファイル名)をHパターンスペース(改行で区切られる)に追加し、その改行をカンマに変更します。

次に、スクリプトはprintfサブディレクトリ名の後にコンマを付け、その後にそこから取得したファイルを続けますsed

これは、最も古い/最も新しい選択においてディレクトリとファイルを区別しないため、そこにディレクトリが必要ない場合は、出力をフィルタリングしてls -tディレクトリを削除する必要があります。

関連情報