Вопрос rsync N новых файлов в каталоге


Каким будет самый простой способ: rsyncing n новых файлов в каталоге на удаленный сервер?


6
2017-11-08 17:20


происхождения




ответы:


Самый простой способ - запустить zsh вместо bash.

rsync -a -- /path/to/directory/*(om[1,42]) remote-server:

В круглых скобках, om заказывает файлы по времени обратного изменения (то есть по возрасту) и [1,42] выбирает первые 42 совпадения.

Если вы хотите только обычные файлы, а не каталоги, добавьте . после открытия круглых скобок. Для получения дополнительных возможностей смотрите «квалификаторы glob» в zshexpn справочная страница,

Если вы хотите совместить файлы в дереве каталогов, /path/to/directory, а не только внутри этого каталога, используйте /path/to/directory/**/*(.om[1,42]), Тем не менее, это отправит все файлы в один и тот же каталог.


6
2017-11-09 00:02



FYI, мне пришлось добавить одну цитату вокруг «* (om [1,42])», чтобы заставить ее работать. Однако я копировал файлы с удаленного сервера на локальный. - c 2
@ c2 Кавычки заставляют расширять подстановочные знаки на удаленной машине. Они необходимы на удаленном пути (и будут работать только в том случае, если ваша оболочка входа на удаленном компьютере в zsh), и не будут работать на локальном пути. - Gilles


Предполагая, что вы хотите отправлять файлы из текущего рабочего каталога:

rsync `ls -tp | grep -v / | head -n <n>` <destination> <options>

будет делать трюк. Например:

rsync `ls -tp | grep -v / | head -n 10` user@host:/dest/dir/ --progress --compress

Это даст ошибку, если в текущем рабочем каталоге нет файлов, или если какой-либо из верхних файлов содержит пробелы или другие специальные символы.

Символы вокруг ls -tp | grep -v / | head -n <n> скажите bash, чтобы запустить команды и заменили их результирующим списком файлов в виде списка, разделенного пробелом. -t опция указывает ls сортировать по метке времени, -p говорит ему добавить / после имен каталогов, а часть grep экранирует строки, заканчивающиеся / поэтому вы не отправляете каталоги. Добавить -c к ls если вы хотите, чтобы новые файлы оценивались по времени создания, а не по времени модификации (хотя обратите внимание, что некоторые программы будут удалять и заменять файлы, а не обновлять их, поэтому ctime и mtime могут быть одинаковыми, даже если файл, кажется, был дольше ).

Я не буду утверждать, что это, без сомнения, простой но это было бы так, как я сначала подумал.


2
2017-11-08 18:29



Не используйте эту команду, если не знаете, что имена файлов не могут содержать «специальный» символ (пробелы, \[?*, управляющие символы или символы, отличные от ASCII). - Gilles