Я установил следующие папки с пустыми текстовыми файлами:
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
выводит список файлов, а порожденный cp
s добавляют новые файлы.
Вы должны исключить подкаталог во время работы find
:
find . -path ./temp/s -prune -o -name '*txt' -exec cp --parents '{}' ./temp/s \;
Обратите внимание, что замена \;
с участием +
будет намного реже cp
процессы.