Pythonheapq.nsmallest

Pythonheapq.nsmallest

最も古いファイル(FIFO)をディレクトリに移動するコマンドを作成しています。結果を"find"ディレクトリにパイプする方が良いですか"ls"、それとも単に " ls"を使用する方が良いですか?より良いか提案してください。

ls -ltr `/bin/find ${in}/* -prune -name "*.txt"  -type f` | head -10 |     
 while read -r infile ; do                    
     -move the file 
done

それとも単に使うべきですか?私が使っている理由は:ls. スクリプトで避けるべきいくつかのfind内容をオンラインで読んだからです。lsしかし、コードの終わりに検索結果をlsfind

答え1

しかし、真珠おそらく大きなディレクトリを「x」回繰り返すよりも速いでしょう。これは無差別のシンプルなソリューションです。

外部ループは、移動するファイルの数(この場合は3つ)を決定します。このループでは、「最も古い」ファイルをglobbingによって生成された最初のファイル名で初期化します*。その後、内部ループは各ファイルのタイムスタンプを比較して、-ot現在の最も古いファイルより古いかどうかを確認します。その場合は、「最も古い」ファイル名を更新します。内部ループが終わったら、ファイルを報告して移動します。

for((count=0; count < 3; count++))
do
  set -- *
  oldest=$1
  for f in ./*
  do
    if [ "$f" -ot "$oldest" ]
    then
      oldest=$f
    fi
  done
  echo mv -- "$oldest" ./.archive
  mv -- "$oldest" ./.archive
done

答え2

Pythonheapq.nsmallest

大きな打撃:

find -printf '%T@ %p\n' |
python noldest.py 1000 |
xargs -Ixxx mv xxx directory_for_old_files

このfindコマンドは、「1970年以降の秒数(%T @)、スペース、ファイル名(%p)」の形式でファイルを一覧表示します。後続xargsのコマンドは、標準入力からファイル名を1つずつ取得し、コマンドを使用してmv xxx directory_for_old_filesxxxをその名前に変更します。

noldest.pyの実装は次のとおりです。

import sys
from heapq import nsmallest
from datetime import datetime


n = int(sys.argv[1])
date_file_pairs = (line.split(' ', maxsplit=1) for line in sys.stdin)  # generators are lazy

def parse_date(date_and_filename):
    seconds_from_1970 = float(date_and_filename[0])
    return datetime.fromtimestamp(int(seconds_from_1970))

for _, filename in nsmallest(n, date_file_pairs, key=parse_date):
    print(filename.rstrip('\n'))  # lines in sys.stdin have trailing newlines

nsmallestパフォーマンスはPython標準ライブラリのアルゴリズム実装によって異なります。

関連情報