Итак, я пытаюсь использовать find
команда, чтобы найти все файлы в моей системе с помощью mtime -x
. Он делает это, но не «находит» каталоги файла.
find . -mtime -2 -exec rsync -av {} /destination/ \;
Я подумал, смогу ли я перенести все каталоги, которые он будет вводить в них, если бы мог, поэтому я попробовал:
rsync -a -f"+ */" -f"- *" source/ destination/
Это работает очаровательно для переноса дерева каталогов, но когда я пытаюсь вытащить файлы в него, они не попадают в отдельные каталоги, они просто перетекают в основной каталог, в который я их скопировал.
Любые идеи, как я могу получить find
команда для поиска каталогов или другой способ решения этой проблемы?
В этой командной строке есть две проблемы:
find . -mtime -2 -exec rsync -av {} /destination/ \;`
Во-первых, при присвоении (одиночных) имен файлов rsync
и не просто каталог, он должен быть явно указан для использования всего пути, а не только имени файла для назначения. Для этого воспользуйтесь опцией -R
. Со страницы руководства по rsync (1):
-R, --relative Использовать относительные пути. Это означает, что на сервер отправляются полные имена путей, указанные в командной строке, а не только последние части имен файлов. Это особенно полезно, если вы хотите отправить несколько разных каталогов одновременно. Например, если вы использовали эту команду: rsync -av /foo/bar/baz.c remote: / tmp / ... это создаст файл с именем baz.c в / tmp / на удаленном компьютере. Если вместо этого вы использовали rsync -avR /foo/bar/baz.c remote: / tmp /, то на удаленном компьютере был бы создан файл с именем /tmp/foo/bar/baz.c, сохраняя его полный путь. Эти дополнительные элементы пути называются «подразумеваемыми каталогами» (т.е. каталогами «foo» и «foo / bar» в приведенном выше примере). [...]
Затем на странице руководства рассказывается, как управлять путем, чтобы только части этого будет присутствовать на принимающей стороне, но здесь это выходит за рамки.
Во-вторых, find
названный выше, будет сообщать не только файлы, но и каталоги. Когда имя каталога дается rsync
в качестве источника он будет синхронизировать весь этот каталог с местом назначения. Этого можно избежать с помощью дополнительного теста. -type f
("тип должен быть файлом") для find
. Однако имейте в виду, что при этом будут исключены не только каталоги, но и сокеты, именованные каналы, блочные и символьные устройства, а также символические ссылки. Для символических ссылок вы можете использовать -xtype
вместо этого параметр, который будет проверять тип цели символической ссылки.
Итак, модифицированная командная строка будет выглядеть так:
find . -тип f -mtime -2 -exec rsync -av -Р {} /destination/ \;
Это будет find
все файлы (-type f
) в текущем пути (.
), которые были изменены в течение последних двух дней (-mtime -2
) и для каждого из них: выполнить (-exec
) rsync
, копируя файл с заданным именем ({}
) к /destination/
, сохраняя большинство атрибутов (-a
), давая подробный вывод (-v
) и воспроизведение всего пути в пункте назначения (-R
).