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

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

ディレクトリがあります

私の主なディレクトリは/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これは、最も古い/最新の選択したディレクトリとファイルの間に違いがないため、望ましくない場合はディレクトリを削除するように出力をフィルタリングする必要があります。

おすすめ記事