Если вы находитесь на платформе с инструментами GNU (find
, sort
, tail
, sed
), и вы хотите вставить все имена в положение, где у вас есть -
, надежное выполнение этого (способом, устойчивым к неожиданным именам файлов) может выглядеть следующим образом:
find /var/lib/pgsql/backups/full/daily_backup -name 'guest*' -type f -printf '%T@ %p\0' |
sort -znr |
tail -z -n +8 |
sed -zEe 's/[^ ]+ //' |
xargs -0 sh -c 'aws s3 cp "$@" s3://all-postgresql-backup/ncldevshore/' _
Там много всего, так что давайте рассмотрим его по частям:
ls
не генерирует вывод, безопасный для программного использования. Таким образом, вместо этого мы используем find
со строкой -printf
, которая ставит метку времени (в эпоху UNIX, секунды с 1970 года) перед каждым файлом и завершает каждую запись NUL (символом, который, в отличие от новой строки, не может существует в именах файлов в UNIX).
sort -z
- расширение GNU, которое разделяет ввод и вывод значениями NUL; -n
указывает числовую сортировку (поскольку метки времени являются числовыми); -r
меняет порядок сортировки.
sed -z
- это расширение GNU, которое опять-таки разграничивает записи по NUL, а не по новым строкам; здесь мы убираем временные метки с записей после их сортировки.
xargs -0 ...
указывает xargs
читать записи, разделенные NUL, из stdin и добавлять их в список аргументов ...
, разбивая его на несколько вызовов всякий раз, когда это превышает максимальную длину командной строки.
sh -c '..."$@"...' _
запускает оболочку - sh
- с командой, включающей "$@"
, которая расширяется до списка аргументов, которые были переданы оболочкой. _
является заполнителем для $0
. xargs
поместит имена, созданные предыдущим конвейером после _
, ставшие $1
, $2
и т. Д., Так что они будут помещены в командную строку aws
вместо "$@"
.
Ссылки
- BashFAQ # 3 - Как сортировать или сравнивать файлы на основе некоторого атрибута метаданных (самое новое / самое старое время изменения, размер и т. Д.)?
- ParsingLs - Почему вы не должны анализировать вывод
ls
- UsingFind - см. Раздел «Действия в массовом порядке» для обсуждения мер предосторожности, необходимых для использования
xargs
без внесения ошибок (что приведено в приведенном выше коде, но другие рекомендации могут и не делать).