Aqui está um liner de bash friendly que copia qualquer pasta que tenha um jpg dentro deles em uma pasta chamada backup enquanto mantém a estrutura de diretórios
mkdir backup; for folder in $(find . -type f -name '*.jpg' | sed -r 's|/[^/]+$||' |sort |uniq); do cp -r --parents $folder backup; done
Primeiro, cria uma pasta vazia backup , em seguida, o comando find procura todos os arquivos no diretório atual que terminam com .jpg . Os comandos sed , sort e uniq ajustam a saída de localização apenas para os nomes de diretório e removem as repetições. Finalmente, o cp -r --parents em um loop copia as pastas recursivamente enquanto cria arquivos que estão faltando.
você pode contornar usando sed -r usando o -printf flag com find , assim
mkdir backup; for folder in $(find . -type f -name '*.jpg' -printf "%h\n" |sort |uniq); do cp -r --parents $folder backup; done
se o seu find não suportar -printf , você pode tentar usar grep
mkdir backup; for folder in $(find . -type f -name '*.jpg' | grep -o "\(.*\)/" |sort |uniq); do cp -r --parents $folder backup; done