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