Назад | Перейти на главную страницу

Как я могу управлять командой find, чтобы «найти» каталоги, в которых находится «найденный» файл?

Итак, я пытаюсь использовать 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).