
おかげで、リストの最後の行だけを表示する方法を学びました。
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
各ディレクトリの最初のパス名を印刷します。