Как рекурсивно копировать только файлы из папок и подпапок?

Если вам нужна сеть, но вы не хотите использовать какие-либо порты (я предполагаю, что это означает IP-порты и, например, последовательный порт), то вам нужно использовать протокол, который не использует порты. Вы можете использовать ICMP и Ping Tunnel для пересылки telnet или ssh через него, или 6to4 (которому присвоен свой собственный тип протокола 41 и он не имеет портов), или подобные меры.

Хотя это ответ на вопрос, вполне возможно, что эти протоколы также блокируются, и само собой разумеется, что такие меры не должны применяться, за исключением очень необычных ситуаций (возможно, за исключением 6to4).

1
26.02.2019, 10:05
2 ответа
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в данном случае является то, что разрешение сравниваемых временных меток составляет всего одну секунду, но это уже другая история)

5
27.01.2020, 23:18

Я попробовал команду ниже, и она сработала нормально

for file in `find /home -type f | awk -F "/" '{print $NF}'`
do
    for dir in `find. -type d| sed "s/\.//g"| sed 's/$/\//g'`
    do
        sudo find $dir -type f -iname $file | awk '{print "ls -ltrh" " " $0}'
    done | sh | sed -n '$p'
done | awk '{print "cp -rvfp" " " $NF " " "/destinationlocationtocopy/"}' | sh
0
27.01.2020, 23:18

Теги

Похожие вопросы