$SHELL
не говорит вам, какую оболочку вы используете, она сообщает вам, что такое переменная окружения SHELL
. Bash устанавливает это как путь к вашей оболочке входа в систему, если он еще не установлен.
Вы используете sh
(dash
, для вас )под sudo, что вы можете легко увидеть, используяpstree
:
$ cat test.sh
pstree $$
$./test.sh
bash───pstree
$ sudo./test.sh
sh───pstree
Использование sh
соответствует POSIX, хотя эта часть спецификации не является обязательной для вариантов реализации sudo.
readlink /proc/$$/exe
также подтвердит, что это именно dash
. Вы также можете использовать любой другой способ определения работающей оболочки из связанного с вами вопроса.
В тире $'abc'
— это одинокий знак доллара, не имеющий значения, за которым следует одна -строка в кавычках -, в основном так же, как foo=$
сохраняет знак в любой оболочке.
Также необходимо указать-t
:
--times, -t preserve modification times
Так что это должно работать:
rsync -dvnt dir1/ dir2/
Вы не просили rsync просмотреть каталоги, так что он просто синхронизирует сами каталоги, а не файлы внутри каталогов. Если вы хотите, чтобы rsync учитывал файлы внутри каталогов, вам нужно передать опцию -r
или -a
или указать файлы в командной строке.
Вы не попросили rsync скопировать какие-либо метаданные. По умолчанию rsync копирует только содержимое. Для каталогов нет содержимого, есть только существование самого каталога :содержимое каталога (файлы внутри него )рассматриваются как отдельные объекты, которые можно копировать независимо (и подвергать фильтрам ). Поскольку testdir7
уже существует в целевом дереве, с этим ничего не поделаешь. Если вы хотите скопировать метку времени в каталоге, вам нужно передать опцию -t
или -a
.
Обратите внимание, что копирование метки времени в каталоге без копирования файлов внутри него редко бывает полезным. Если вы создаете (или удаляете и т. д. )файл в каталоге, это обновляет время модификации каталога. С другой стороны, изменение существующего файла или внесение изменений в каталог не обновляет время изменения каталога. Если вы обновите время модификации dir2/testdir7
и , а затем скопируете файлы из dir1/testdir7
в dir2/testdir7
, время модификации dir2/testdir7
будет временем копирования файла. Rsync не будет основывать свое решение о копировании содержимого каталога на метке времени каталога, поскольку она не предоставляет никакой информации о состоянии содержимого каталога.