Функция zsh для экспорта нескольких переменных из буфера обмена

Питон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.

0
10.04.2021, 00:49
1 ответ

Лучше бы это было:

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). Ошибка, которую вы получаете, не может быть объяснена этим конкретным вводом.

2
28.04.2021, 22:53

Теги

Похожие вопросы