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