Вот что-то, что должно работать без использования, находят. Различием от ответов, уже отправленных, является порядок правил фильтра. Правила фильтра в команде rsync работают много как iptable правила, первое правило, что файл соответствует, является тем, которое используется. Из страницы руководства:
Поскольку список файлов/каталогов для передачи создается, rsync проверяет, что каждое имя, которое будет передано против списка, включает/исключает шаблоны в свою очередь, и первый шаблон соответствия действуется на: если это - исключить шаблон, то тот файл пропускается; если это - включать шаблон затем, что имя файла не пропускается; если никакой шаблон соответствия не найден, то имя файла не пропускается.
Таким образом Вам нужна команда следующим образом:
rsync -avn --include="**.pdf" --exclude="*" ~/LaTeX/ ~/Output/
Отметьте шаблон "**.pdf". Согласно странице справочника:
если шаблон содержит / (не подсчет запаздывания/) или "**", то это подобрано против полного пути, включая любые ведущие каталоги. Если шаблон не содержит / или "**", то он подобран только против заключительного компонента имени файла. (Помните, что алгоритм применяется рекурсивно, таким образом, "полное имя файла" может на самом деле быть любой частью пути от начального каталога на вниз
В моем маленьком тесте это действительно работает рекурсивно вниз дерево каталогов и только выбирает pdfs.
Вы могли сделать тот этот путь:
[[ $(id -u) -eq 0 ]] || { echo >&2 "Must be root to run script"; exit 1; }
("обычное" условное выражение с арифметическим бинарным оператором в первом операторе), или:
(( $(id -u) == 0 )) || { echo >&2 "Must be root to run script"; exit 1; }
(арифметическая оценка для первого теста).
Заметьте изменение ()
-> {}
- фигурные скобки не порождают подоболочку. (Поиск man bash
для "подоболочки".)
Круглые скобки вокруг тех команд создают подоболочку. Ваша подоболочка echos "Должна быть корнем для запущения скрипта", и затем Вы говорите подоболочке выходить (хотя это уже имело бы, так как больше не было команд). Самый легкий способ зафиксировать его состоит в том, чтобы, вероятно, просто использовать if
:
if [[ `id -u` != 0 ]]; then
echo "Must be root to run script"
exit
fi
id -u == 0
, который означал бы, что Вы - корень. Вы хотите [[ $(id -u) != 0 ]]; then
.
– Tim Kennedy
04.11.2011, 19:32
[ "$UID" != 0 ] && echo 'You have to be root.' && exit 1;
Также отметьте $UID
, который сохраняет порождение процесса. Я думаю, что Вы могли бы даже предпочесть $EUID
.
– janmoesen
04.11.2011, 20:19
((UID)) && echo 'You have to be root.' && exit 1
.
– manatwork
04.11.2011, 20:25
set -e
прерываться. Одно решение той проблемы [ "$UID" != 0 ] && echo 'You have to be root.' && exit 1 || true
.
– sam hocevar
05.11.2011, 00:14
Скобки вокруг ||
и &&
не требуются, поскольку они правоассоциативные. Следующие два выражения эквивалентны:
expr1 || expr2 && expr3
expr1 || { expr2 && expr3 }
Так &&
вместо ;
работал бы просто великолепно, как echo
возвратит true.
[[ $(id -u) == 0 ]] || echo "Must be root to run script" && exit 1
С помощью bash:
[ $UID -ne 0 ] && echo "Must be root to run script" && exit 1
это может вам помочь в bash
[oracle@rac1 ~]$ which bash
/bin/bash
[oracle@rac1 ~]$ cat test1.sh
if [ `id -u` != 0 ]
then
echo "Must be root to run the script
"
exit
fi
exit 1
для создания, понимают родительский процесс, что проблема произошла. разделители полей – SamK 04.11.2011, 18:32[[
для числового сравнения использовать((
. – Chris Down 04.11.2011, 21:59[[
прекрасен, пока Вы используете-eq
вместо==
. – Let_Me_Be 24.11.2011, 12:10(( EUID )) && ...
– Chris Down 24.11.2011, 13:14