У меня много таких каталогов:
$ ls
1_true 1_false 2_true 2_false 3_true 3_false ...
Я хочу скопировать файлы из «* _true /» в другой каталог.
Когда я запускаю команду, как показано ниже
find . -name "*_true" -exec cp "{}"/* "../out_true" ";"
, это выдает мне сообщения об ошибках вроде этого:
cp: cannot stat './1_true/*': No such file or directory
cp: cannot stat './2_true/*': No such file or directory
cp: cannot stat './3_true/*': No such file or directory
...
, как исправить эту ошибку? спасибо!
ПРИМЕЧАНИЕ. Количество моих «истинных» каталогов превышает 100000
.Можно упростить его вполне немного
cp ?_true/* ../out_true/
будет работать также.
Это не будет, однако, работать, когда у Вас будет очень большое количество файлов.
найденный ответ, с помощью xargs
вместо -exec
find . -name "*_true" -print0 | xargs --null -I{} sh -c 'cp "$1"/* "../out_true"' -- {}
Можно ограничить, находят для убывания не больше, чем n уровни с -maxdepth
. Это будет соответствовать * _true и копировать содержание с помощью rsync. Запаздывающая наклонная черта на исходном каталоге изменит поведение rsync и только скопирует содержание каталога а не каталога это сам.
find -maxdepth 1 -type d -name '*_true' -exec rsync -a "{}/" ../out_true \;
или
for i in *_true; do
rsync -a "$i/" ../out_true
done