heapq.nsmallest
баш:
find -printf '%T@ %p\n' |
python noldest.py 1000 |
xargs -Ixxx mv xxx directory_for_old_files
Здесь команда find
выводит список файлов в формате «секунды с 1970 (%T@ ), пробел, имя файла (%p )». Завершающая команда xargs
берет имена файлов из стандартного ввода одно за другим и применяет команду 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.
Лучше бы это было:
eval -- "$(pbpaste)"
или:
pbpaste | source /dev/stdin
eval
оценивает шелл-код, полученный в результате конкатенации, с пробелами своих аргументов. Итак, здесь мы берем вывод pbpaste
с подстановкой команд $(...)
, заключаем в кавычки, чтобы он не был разделен, и передаем его как один аргумент в eval
(, которому предшествует --
, который отмечает конец параметров в случае, если этот аргумент начинается с-
).
source
оценивает шелл-код, хранящийся в файле, переданном в качестве первого аргумента. С помощью source /dev/stdin
мы говорим ему оценить код, который он может прочитать на своем стандартном вводе,который здесь представляет собой канал с выходом pbpaste
на другом конце.
В eval | $(pbpaste)
вы запускаете две команды, соединенные каналом. Первый — eval
без аргументов, поэтому он ничего не оценивает и ничего не выводит в конвейер. Второй строится, беря вывод pbpaste
, разбивая его на $IFS
и получившиеся слова составляют простую команду.
С показанным вами кодом это приведет к тому, что команда export
будет запущена с FOO=BAR
, export
, BAR=BIZ
, export
, BAZ=FOO
в качестве аргументов, поэтому в этом случае должно работать (будет экспортировать эти переменные FOO
, BAR
, BAZ
, а также переменную export
). Ошибка, которую вы получаете, не может быть объяснена этим конкретным вводом.