Я пытаюсь создать каталог, в котором будут храниться все и только мои PDF-файлы, скомпилированные из LaTeX. Мне нравится хранить каждый проект в отдельной папке, все в большой папке LaTeX
. Итак, я попытался запустить:
rsync -avn *.pdf ~/LaTeX/ ~/Output/
который должен найти все PDF-файлы в ~/LaTeX/
и передать их в выходную папку. Это не работает Это говорит мне, что не найдено соответствий для " *.pdf
". Если я пропущу этот фильтр, команда перечислит все файлы во всех папках проекта в LaTeX. Так что это проблема с фильтром * .pdf. Я попытался заменить ~/
полный путь к моему домашнему каталогу, но это не дало эффекта.
Я использую Zsh. Я пытался сделать то же самое в bash и даже с фильтром, который перечислял каждый файл в каждом подкаталоге ... Что здесь происходит?
Почему rsync не понимает мой фильтр только для PDF?
ХОРОШО. Итак, обновление: нет, я пытаюсь
rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/
И это дает мне весь список файлов. Я думаю, потому что все соответствует первому шаблону ...
**
шаблон zsh ) должен работать.Ответы:
TL, DR:
Rsync копирует источник (и) в место назначения. Если вы передадите в
*.pdf
качестве источников, оболочка расширит это до списка файлов с.pdf
расширением в текущем каталоге. Никакого рекурсивного обхода не происходит, потому что вы не передали ни один каталог в качестве источника.Так что вам нужно запустить
rsync -a ~/LaTeX/ ~/Output/
, но с фильтром, чтобы rsync копировал.pdf
только файлы. Правила фильтра Rsync могут показаться пугающими, когда вы читаете руководство, но вы можете создать множество примеров с помощью нескольких простых правил.Включения и исключения:
--exclude=*~
,--exclude=/some/relative/location
( по отношению к исходному аргументу, например , это исключает~/LaTeX/some/relative/location
).--include=*/
), а затем исключите остальные с помощью--exclude='*'
. Это потому что:--include='directory/***'
сделаю это.Шаблоны:
/
, он применяется к каталогу без имени файла./
, он применяется только к каталогам./
, он применяется ко всему пути из каталога, который был передан в качестве аргументаrsync
.*
любая подстрока одного компонента каталога (т.е. никогда не совпадает/
);**
соответствует любой подстроке пути.Если исходный аргумент заканчивается на
/
, его содержимое копируется (rsync -r a/ b
создаетсяb/foo
для каждогоa/foo
). В противном случае сам каталог копируется (rsync -r a b
создаетсяb/a
).Таким образом, здесь мы должны включить
*.pdf
, включить каталоги, содержащие их, и исключить все остальное.Обратите внимание, что при этом копируются все каталоги, даже те, которые не содержат соответствующего файла или подкаталога, содержащего один. Этого можно избежать с помощью этой
--prune-empty-dirs
опции (это не универсальное решение, поскольку вы не сможете скопировать каталог, даже если сопоставите его явно, но это редкое требование).источник
**
шаблона zsh ), это воссоздает структуру каталогов в целевой директории. Я не уверен, хочет ли это то, что хочет ОП .../etc/lsyncd/lsyncd.conf.lua
файле. Есть идеи?По умолчанию все включено, поэтому вы должны явно исключить все после включения файлов, которые вы хотите передать. Удалите --dry-run для фактической передачи файлов.
Если вы начинаете с:
Тогда жадное совпадение сразу все исключит.
Если вы пытаетесь:
Тогда только файлы PDF в папке верхнего уровня будут переданы. Он не будет следовать ни за какими каталогами, так как они исключаются знаком *.
источник
--prune-empty-dirs
(или ярлык-m
), вы даже сэкономите много пустых каталогов в месте назначения, кроме тех случаев, когда вы хотите, чтобы они были напоминанием или структурным планом./etc/lsyncd/lsyncd.conf.lua
файле. Есть идеи?Если вы используете шаблон как
*.pdf
, оболочка «расширяет» этот шаблон, то есть заменяет шаблон на все совпадения в текущем каталоге. Команда, которую вы запускаете (в данном случае rsync), не знает о том, что вы пытались использовать шаблон.Когда вы используете zsh , существует простое решение:
**
шаблон можно использовать для рекурсивного сопоставления папок. Попробуй это:источник
rsync -avn ~/LaTeX/**/*.pdf ~/Output
, но в--include
любом случае решение с более масштабируемым.**
может пригодиться и в других ситуациях.cd ~/Latex && cp -p **/*.pdf ~/Output
избежать ошибки «слишком длинная командная строка».Вы можете использовать
find
и промежуточный список файлов (files_to_copy
) для решения вашей проблемы. Убедитесь, что вы находитесь в своем домашнем каталоге, а затем:find LaTeX/ -type f -a -iname "*.pdf" > files_to_copy && rsync -avn --files-from=files_to_copy ~/ ~/Output/ && rm files_to_copy
Протестировано с Bash.
источник
-exec
вариант использования find или использованиеxargs
. Что-то вроде:find LaTeX/ -type f -iname "*.pdf" -print0 | xargs -0 -i rsync -avn {} Output/
standalone
которые не имеют.tex
файла с тем же именем, так как это будут изображения, включенные в некоторый документ ...--files-from
принимает чтение из стандартного ввода. Это будет работатьfind LaTeX/ -type f -a -iname "*.pdf" | rsync -avn --files-from=- ~/ ~/Output/
Судя по разделу «ВКЛЮЧИТЬ / ИСКЛЮЧИТЬ ПРАВИЛА ШАБЛОНА» на странице руководства, способ сделать это
Критическое различие между этим и ответом kbrd заключается в
--include="*/"
флаге, который говорит rsync идти вперед и копировать любые найденные каталоги, как бы они ни назывались. Это необходимо, потому что rsync не будет возвращаться в подкаталог, если ему не было поручено скопировать этот подкаталог.Также обратите внимание, что кавычки не позволяют оболочке пытаться развернуть шаблоны до имен файлов относительно текущего каталога и выполнить одно из следующих действий:
Преуспеть и испортить ваш фильтр (не слишком вероятно в середине флага, подобного этому, хотя вы действительно никогда не знаете, когда кто-то создаст файл с именем
--include=foo.pdf
...)Сбой и потенциальная ошибка вместо выполнения команды (как вы обнаружили, zsh делает по умолчанию).
источник
include
добавление дополнительных вещей уже ничего не меняет. Если вы видите , что я имею в виду ...--exclude="*"
после--include="*.pdf"
, или это все перенесет.Как насчет этого:
источник
man rsync
устанавливает фильтр после опций и перед источником / назначением. Я попробовал это, и это не сработалоa
опция для архива и, кроме всего прочего, делает рекурсивное копирование.Вот то, что должно работать без использования find. Отличие от уже опубликованных ответов заключается в порядке правил фильтрации. Правила фильтрации в команде rsync работают во многом подобно правилам iptable, первое правило, которому соответствует файл, - это то, которое используется. Со страницы руководства :
Таким образом, вам нужна команда следующим образом:
Обратите внимание на шаблон «**. Pdf». Согласно справочной странице :
В моем небольшом тесте это работает рекурсивно вниз по дереву каталогов и выбирает только PDF-файлы.
источник
*.pdf
в каталог верхнего уровня (но не в него~/LaTeX/foo/bar.pdf
).**
. Было бы неплохо иметь пример этого. ;)Это мое предпочтительное решение:
find
Команда легче понять , чем включить / исключить правилаrsync
:-)Если вы хотите скопировать только PDF-файлы, просто измените
.jpg
на.pdf
источник