特定のパターンを持つファイルを見つけて、パターンに一致する最新のファイルをフルパスで印刷したいと思います。
find ../*.gz -type f -print0 | sort -nr | cut -d: -f2- | head -n 1
同じフルパスをどのように印刷できますか?
ユーザーが要求した場合ls -l
:
ls -l
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:29 fa1caae85
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:28 ga1c93eda
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:28 la1cbbh05
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:08 node_modules
drwxrwxr-x 3 xxx xxx 4096 Jun 27 23:08 _tasks
最初の3つのフォルダにはすべて必須ファイルが含まれていますが、そのフォルダから最新のファイルをインポートしたいと.gz
思います。.gz
答え1
非正統的なアプローチ:
zsh -c 'print -r $PWD/**/*.gz(.om[1])'
どこ
()
afterは*.gz
いわゆるglob修飾子を使用することを意味します。.
一般ファイルのみが考慮されます。om
編集時間で並べ替え[1]
最初の要素のみを取るD
隠しgzファイル(thisなど)も考慮するには、修飾子を追加してくださいfind
。
明らかに、すでにzshを使用している場合は、それを呼び出すために使用する必要はありませんzsh -c
。
答え2
このコマンドを使用してこれを実行できます。
find "$(pwd)" -type f -name "*.gz" -printf "%T@ %p\n"| sort -rn | cut -d' ' -f 2- | head -n 1
find
GNUパス名には改行文字は含まれておらず、ファイル名はロケールの有効なテキストであると想定しています。改行文字以外の文字を処理するには、次のように変更できます。
(
export LC_ALL=C
find "$PWD" -type f -name '*.gz' -printf '%T@\t%p\0' |
sort -zrn | head -zn 1 | cut -zf 2- | tr '\0' '\n'
)
GNUユーティリティのバージョンは比較的新しいバージョンであると仮定します。つまり、NULはファイルパスには現れない唯一の文字なので、行(改行で区切られたレコード)の代わりにNULを使用してレコードを区切ります。
POSIXシェルの現在の作業ディレクトリへのパスを含む変数を使用して、コマンドの置き換え()を防止します$(pwd)
。これは末尾の改行を削除します。$PWD
ロケールをC
(ここではローカルサブシェル環境で(...)
)に切り替えると、各バイトは常に文字として扱われます(通常のソートとテキスト処理も単純化されます)。
答え3
これは私にとってうまくいきます。
ls -t ../*.gz | head -n1
からman ls
:
-t sort by modification time, newest first