2017-05-11 7 views
0

私はN最新のファイルを検索する方法を知っているいくつかの文字列で始まるファイル名を指定して、最新のN個のファイルを検索し、私はいくつかの文字列で始まるファイル名のN個のファイルを検索する方法を知っているバッシュ:

ls -latr | tail -n32 

そして、

ls filestring* | tail -n32 

しかし、ファイル名がいくつかの文字列で始まる最新の50個のファイルを探したいと思います。

+0

人間の批評またはスクリプトによる使用の場合は、 'ls -t'はあなた自身のために正しいものです。それはスクリプトにとって正しいことではありません。 –

+0

'zsh'のためのプラグインです。このタイプのタスクに適しています:' print -l filestring *(om [1,50]) '。 – chepner

答えて

0
ls -lt fileprefix* | head -32 

ソートとテールを逆にする必要はありません。

+1

これは、接頭辞で始まるファイルが1つのコマンドラインに収まるファイルよりも多い場合には機能しません。 –

+0

これは私の目的のために働く – tptptpfg

1

以下はGNU findsortが必要ですが、(改行と名を含む)すべての可能なファイル名で動作し、ディレクトリに指定された接頭辞で始まるファイルの数はARG_MAXに収まらない場合:

#!/usr/bin/env bash 
files=() 
counter=32 
while IFS= read -r -d ' ' timestamp && 
     IFS= read -r -d '' filename && 
     ((--counter >= 0)); do 
    files+=("$filename") 
done < <(find "$dir" -type f -printf '%[email protected] %p\0' | sort -zgr) 

declare -p files ## print the generated array of filenames 
  • -printf '%[email protected] %p\0'を使用すると、各結果がUNIXのタイムスタンプ(seconds-since-epoch)で出力されます。スペース;ファイル名。そしてNUL。
  • sort -zは、入力レコードと出力レコードを区切るNUL(改行とは異なり、ファイル名には存在しない)を使用するように指示します。
  • IFS= read -r -d ' ' timestamp && IFS= read -r -d '' filenameは、与えられたレコードのスペースまでの内容を変数timestampに読み込み、次のNULまですべてを変数filenameに読み込みます。

Why you shouldn't parse the output of ls(1)のメタデータに基づいてファイルをソートまたは比較する方法については、BashFAQ #3を参照してください。