各ディレクトリの最後の行だけをリストする方法は?

各ディレクトリの最後の行だけをリストする方法は?

おかげで、リストの最後の行だけを表示する方法を学びました。

ls -ltr | sed '$!d'

今、私はこれをfindコマンドと組み合わせて、すべてのディレクトリでこれを繰り返す方法を考えましたが、間違った解決策しか得られませんでした。

find / -type d | xargs ls -ltr | sed '$!d'

正しく読み取ると、各ディレクトリの最後の行は表示されず、すべてのディレクトリのすべてのリストの最後の行だけが表示されます。

正しいことは何ですか?

答え1

私はこの構成を出発点にします。

find / -type d -print0 | xargs -0 -I'{}' sh -c 'ls -ltr {} | tail -1'

警告:空のディレクトリが好きではありません(total 0出力)。

答え2

たぶんこれはより良いかもしれません:findとshellの組み合わせ

find / -type d -print0 | while read -r -d '' dir; do 
    ls -ltr "$dir" | sed '$!d'
done

find見つかった各ディレクトリを区切るために改行の代わりにヌルバイトを使用して出力します。このストリームは、nullで区切られた各ディレクトリ名を抽出するwhileループに供給されます。read -d ''その後、各ディレクトリについて、最後の行を除くすべての出力がls削除されますsed

重要なことは、while各ディレクトリ名を繰り返して、各ディレクトリの最新のファイルを見つけることができることです。

これの大きな問題は、ls -l出力にディレクトリ名が表示されないため、出力が意味をなさない可能性があることです。ファイルは表示できますが、そのファイルがどのディレクトリに表示されるかはわかりません。

各ディレクトリで最新のファイルを見つけるには、次の手順を実行します。

find . -type f -printf "%h:%T@:%p\n" |
sort -t: -k1,1r -k2,2nr |
awk -F: '!seen[$1]++ {print $3}'
  • findディレクトリ、変更時刻、およびパス名を取得する
  • sortディレクトリ別にグループ化し、時間別にソート
  • awk各ディレクトリの最初のパス名を印刷します。

関連情報