Como copiar vários arquivos com um mesmo nome do diretório children para outro diretório sem perder o diretório pai?

2

Tenho pouco incômodo ao copiar arquivos de imagem de outro projeto Android para o atual.

Suponha que eu tenha arquivos chamados nice_little_icon.png em cada um dos diretórios drawable-ldpi , drawable-mdpi , drawable-hdpi , drawable-xhdpi e drawable-xxhdpi , que estão abaixo do diretório res do Projeto1.

Agora, como copio esses arquivos no diretório res do projeto2 usando um único comando Linux / Unix?

para que meu resultado final pareça

Project1/../res/drawable-ldpi/nice_little_icon.png -> Project2/../res/drawable-ldpi/nice_little_icon.png
Project1/../res/drawable-mdpi/nice_little_icon.png -> Project2/../res/drawable-mdpi/nice_little_icon.png
Project1/../res/drawable-hdpi/nice_little_icon.png -> Project2/../res/drawable-mdpi/nice_little_icon.png
Project1/../res/drawable-xhdpi/nice_little_icon.png -> Project2/../res/drawable-xhdpi/nice_little_icon.png
Project1/../res/drawable-xxhdpi/nice_little_icon.png -> Project2/../res/drawable-xxhdpi/nice_little_icon.png
    
por Samuel Robert 07.08.2016 / 16:39

2 respostas

1

Você pode usar o comando pax (um substituto padronizado para tar e %código%). Este comando está presente em todos os sistemas compatíveis com POSIX, mas tenha em atenção que algumas distribuições do Linux o omitem da sua instalação predefinida. cpio copia cada caminho no diretório de destino.

pax -rw -pe drawable-*/nice_little_icon.png ../../Project2/res/

Em vez de confiar em curingas no shell, você pode usar a opção pax para ignorar alguns arquivos.

pax -rw -pe -'s!^drawable-[^/]*/nice_little_icon\.png$!&!' -'s!.*/.*!!' drawable-* ../../Project2/res/
    
por 08.08.2016 / 00:15
2

Você pode usar rsync .

rsync -avzh -n --include='*/' --include='*nice_little_icon.png' --exclude='*' Project1/../res/ Project2/../res/

Isso copiará somente os arquivos chamados nice_little_icon.png de Project1/../res/* para Project2/../res/ e criará os diretórios-pai do arquivo ( drawable-ldpi , drawable-ldpi , etc.) sob Project2/../res/ se eles não o fizerem existe.

Explicando o comando rsync :

  • -avzh : -a significa basicamente 'recursivo e preserva o timestamp, permissões e algumas outras coisas', -v significa detalhado, -z significa compactar arquivos durante a transferência (não é realmente necessário, mas eu gosto de usá-lo de qualquer maneira), e -h significa impressão em legível.
  • -n : significa corrida a seco. Então, executar este comando não fará nada. Você precisará remover isso para realmente fazer o comando agir.
  • --include='*/' --include='*nice_little_icon.png' --exclude='*' : esta é basicamente a maneira de dizer ao rsync para copiar apenas os arquivos que terminam em nice_little_icon.png e excluir todo o resto.
  • Project1/../res/ : o diretório de origem. O último / é muito importante, significa 'copie o que estiver em res/ '. Se você removeu esse / , copiará o diretório real res para o destino, o que não é o que você deseja.
  • Project2/../res/ : o diretório de destino.

Quando você executar o comando acima, ele mostrará o que ele fará (isto é, quais diretórios e arquivos serão copiados):

./
drawable-hdpi/
drawable-hdpi/nice_little_icon.png
drawable-mdpi/
drawable-mdpi/nice_little_icon.png
...

Deve ser algo parecido (isto é, os diretórios pai e apenas o arquivo nice_little_icon.png ). Se estiver correto, remova o -n do comando para realmente executar uma ação e copiar os arquivos .

    
por 07.08.2016 / 17:29

Tags