find /home ! -type d -exec bash -c ' for pathname do if [ "$pathname" -nt "/tmp/calculation/${pathname##*/}" ] then cp "$pathname" /tmp/calculation fi done' bash {} +
Это позволит найти все файлы каталога, отличные от -, в каталоге
/home
, а для их пакетов будет вызван короткий скриптbash
.Короткий сценарий
bash
будет перебирать текущую группу путей и для каждого будет проверять с помощью теста-nt
, является ли текущий файл более новым, чем копия в целевом каталоге (, или копия не существуют там ). Если файл в целевом каталоге более старый или если он не существует,cp
используется для копирования текущего файла в целевой каталог.Расширение параметра
${pathname##*/}
удалит любой путь к каталогу перед фактическим именем файла, оставив только часть пути к имени файла. Его можно заменить на$(basename "$pathname")
.Связанные:
В основном не связаны:
Тест -nt
не является стандартным тестом -. Вот почему я решил использовать bash
для внутреннего скрипта, который вызывает find
. Использование sh -c
вместо bash -c
, вероятно, приведет к тому, что сработает , но семантика теста может немного отличаться в разных оболочках, которые могут маскироваться под sh
.
Например, в оболочках bash
, zsh
и ksh
проверка -nt
верна, если первый операнд имеет отметку времени модификации, более новую, чем у второго операнда, или если второй операнд не существует.
В оболочке dash
, однако, оба файла чаще всего существуют, и первый файл должен быть новее второго, чтобы тест был верным (в соответствии с документацией ). В данном случае эта разница не была бы проблемой.
В оболочке yash
в руководстве не указано, что произойдет, если какой-либо файл не существует.
Таким образом, безопаснее использовать конкретную оболочку при использовании нестандартного -средства, даже если в данном конкретном случае вероятно, оно в любом случае будет работать с sh -c
.
(Недостатком использования bash
в данном случае является то, что разрешение сравниваемых временных меток составляет всего одну секунду, но это уже другая история)