パターンのあるファイルを見つけて最新のファイルをインポートする

パターンのあるファイルを見つけて最新のファイルをインポートする

特定のパターンを持つファイルを見つけて、パターンに一致する最新のファイルをフルパスで印刷したいと思います。

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

findGNUパス名には改行文字は含まれておらず、ファイル名はロケールの有効なテキストであると想定しています。改行文字以外の文字を処理するには、次のように変更できます。

(
  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

関連情報