最も古いファイル(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
しかし、コードの終わりに検索結果をls
。find
答え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_files
xxxをその名前に変更します。
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標準ライブラリのアルゴリズム実装によって異なります。