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

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

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

1/a.txt
2/b.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

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

Вы должны исключить подкаталог во время работы find:

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

Обратите внимание, что замена \; с участием + будет намного реже cp процессы.