Como copiar todas as pastas que contêm um arquivo específico

17

Eu quero fazer backup apenas das minhas pastas de música FLAC. Os arquivos FLAC podem ser aninhados assim dentro das pastas:

AlbumName/
├── Files/
│   ├── someSong01.flac
│   ├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

Como faço para copiar e mover todas as pastas do Nome do Álbum com sua estrutura e conteúdo correspondentes que contenham algum lugar dentro de pelo menos um arquivo FLAC (suponho que isso seja suficiente para dizer: a música está no formato FLAC)

EDITAR: Os arquivos FLAC poderiam ser aninhados; então eu posso ter:

AlbumName2/
├── someSong01.flac
├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
|   └── someCover02.jpg

E eu quero copiar essas pastas com todo o seu conteúdo, não apenas arquivos FLAC, e colar em outro diretório.

Então, se eu tiver também

AlbumName3/
├── someSong01.mp3
├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
|   └── someHiddenSong.flac

e

AlbumName4/
├── Files/
│   ├── someSong01.mp3
│   ├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

Eu quero recursivamente cp para outro diretório AlbumName, AlbumName2 e AlbumName3, mas não AlbumName4

EDITAR: Nenhuma das respostas estava realmente fazendo o que eu queria, então acabei usando algo assim:

 find -mindepth 2 -name '*.flac' -exec dirname {} \; | awk -F "/" '{print $2}' | sort -u | while read -r dirname; do cp -r "$dirname" "backup/"; done

basicamente eu listo todos os arquivos flac, eu recupero a pasta raiz usando o awk, eu apago as duplicatas e faço o que eu quero

    
por fricadelle 21.12.2017 / 09:08

5 respostas

18

Uma opção é usar o rsync, que copia apenas arquivos flac e preserva a estrutura de diretórios:

rsync -avzm --include=*/ --include=*.flac --exclude=* albums/ backup/
  • um arquivo
  • v verbose
  • compressa
  • z durante a transferência (pode não ser útil copiar no mesmo computador)
  • m podar dirs vazios
  • primeiro inclui todos os diretórios
  • segunda inclusão inclui arquivos flac
  • a exclusão exclui todos os outros arquivos
por nobody 21.12.2017 / 09:49
9

oi meu amigo você pode usar

mkdir newdirectory
cp -r --parents */*.flac newdirectory/
    
por amir.m ghazanfari 21.12.2017 / 09:25
5

Respostas agradáveis

Eu quero adicionar mais uma maneira você também pode usar uma combinação de find e cpio

find . -name "*.flac" -print0|cpio --null -pdm destination/

% bl0ck_qu0te%
  • Opções usadas no comando acima:
% bl0ck_qu0te%

Também é possível usar rsync ou escrever um script de shell para localizar e copiar arquivos com a estrutura de diretórios.

% bl0ck_qu0te%     
por bsdboy 21.12.2017 / 10:07
4

Resposta 1: Você também pode usar o comando find para o mesmo.

mkdir newDir && find AlbumName/ -iname "*.flac" -exec cp --parents "{}" newDir/ \;

Explicação:

mkdir cria um novo diretório. O comando find localiza *.flac arquivos localizados na pasta AlbumName . O comando exec executa o comando cp para cada nome de arquivo que find retornou.

Answer 2: Você também pode usar o comando find com xargs

mkdir newDir && find AlbumName/ -iname "*.flac" | xargs -I{} cp --parents {} newDir/

Mais informações: localizar , xargs

    
por mf_starboi_8041 21.12.2017 / 09:45
0

Apenas tive que resolver o mesmo problema para minha biblioteca de músicas e resolvi o problema usando o seguinte script adaptado. Eu não o desenvolvi completamente, ou seja, com variáveis, já que pretendo usá-lo apenas uma vez:).

O script move cada diretório contendo arquivos flac, incluindo todos os outros arquivos e subdiretórios, para um novo local usando o rsync. O rsync permite retomar o script se ele parar durante o processo.

Minha estrutura de biblioteca:

library
|-artist
  |- album 1 (mp3)
  |- album 2 (flac)

Nova estrutura de biblioteca:

library
|-artist
  |- album 1 (mp3)

library-lossless
|-artist
  |- album 2 (flac)

(1) inicie o seguinte shell script no destino SOURCE (substitua TARGET pelo respectivo diretório de sua escolha - usei apenas o caminho absoluto)

linha 1: encontre todos os diretórios que contenham arquivos flac e pipe (|) em ordem. linha 2: remover duplicatas com classificação e canalizar essa lista no loop do
linha 3: para cada diretório do
linha 4: mostra o diretório em andamento linha 5: rsync para o diretório de destino mais remover a estrutura de origem e preservação (-R) no local de destino
linha 6: remova o diretório vazio (como o rsync apenas remove arquivos)

find . -type f -name \*.flac -printf "%h\n" | 
sort -u | 
while read -r dirname; do
    echo $dirname
    rsync -azvm -R --remove-source-files "${dirname}" TARGET
    find "${dirname}" -type d -delete
done

(2) após executar com sucesso o script em (1) você pode executar o seguinte comando no diretório fonte

find . -depth -type d -empty -delete

Este comando exclui todos os diretórios vazios não excluídos no script. Ou seja Diretórios "Artist", onde todas as subpastas / álbuns incluíam arquivos flac.

    
por wundabua 25.12.2017 / 20:55