использование find, exec и cp для копирования определенных файлов с сохранением пути к каталогу

использование find, exec и cp для копирования определенных файлов с сохранением пути к каталогу

Я создал следующие папки с пустыми текстовыми файлами:

1/a.txt
2/b.txt

Я хочу скопировать только файлы txt в другой каталог, сохранив при этом их структуру каталогов. Поэтому я попробовал следующие команды:

mkdir -p temp/s;
find ./ -name '*txt' -exec cp --parents '{}' ./temp/s \;

Теперь я вижу следующие файлы из моего текущего каталога:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt
temp/s/temp/s/2/b.txt

Я не понимаю, почему temp/s/temp/s/2/b.txtвозникла последняя строка. Может кто-нибудь объяснить мне, почему это произошло и как я могу исправить свою команду так, чтобы она tempне была вложенной в другую temp?

Вот конечный результат, которого я ожидал:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt

решение1

У тебясостояние гонки: поскольку temp/sнаходится в findпути поиска , findвыводит список файлов, в то время как порожденные cps добавляют новые файлы.

Вам необходимо исключить подкаталог при запуске find:

find . -path ./temp/s -prune -o -name '*txt' -exec cp --parents '{}' ./temp/s \;

Обратите внимание, что замена \;на +приведет к появлению гораздо меньшего cpколичества процессов.

Связанный контент