Como posso copiar todos os arquivos e pastas de um diretório para outro com estrutura semelhante a 'find' e 'xargs'?

1

Por exemplo, eu uso find command find /usr/share/icons -iname 'foxitreader*' localizar os arquivos:

/usr/share/icons/hicolor/32x32/apps/FoxitReader.png
/usr/share/icons/hicolor/48x48/apps/FoxitReader.png
/usr/share/icons/hicolor/64x64/apps/FoxitReader.png
/usr/share/icons/hicolor/128x128/apps/FoxitReader.png
/usr/share/icons/hicolor/16x16/apps/FoxitReader.png

e eu quero usar xargs copiá-los para o .local/share/icons/ , e no diretório icons tem a mesma estrutura de subdiretórios, que é:

 └── hicolor
    ├── 16x16
    │   └── apps
    │       ├── 1B94_WScript.0.png
    │       ├── 1CD8_rundll32.0.png
    │       ├── 1E64_notepad.0.png
    │       ├── 2402_msiexec.0.png
    │       
    ├── 24x24
    │   └── apps
    │       ├── 6C56_Timwp.0.png
    │       └── FoxitReader.png
    ├── 256x256
    │   └── apps
    │       ├── 1E64_notepad.0.png
    │       ├── 2402_msiexec.0.png
    │       ├── 2EF4_wordpad.0.png
    ├── 32x32
    │   └── apps
    │       ├── 1B94_WScript.0.png
    │       ├── 1CD8_rundll32.0.png
    │       ├── 1E64_notepad.0.png
    └── 48x48
        └── apps
            ├── 1CD8_rundll32.0.png
            ├── 1E64_notepad.0.png
            ├── 2402_msiexec.0.png

e eu só quero copiar os arquivos que encontro, não toda a estrutura de diretórios, então como posso copiar esses arquivos para o diretório correspondente, como: /usr/share/icons/hicolor/32x32/apps/FoxitReader.png para .local/share/icons/32x32/apps/FoxitReader.png , etc. br> E o diretório icons já tem esses subdiretórios, e não está vazio, então você não pode usar apenas cp para mesclá-los, e eu uso find para encontrar os arquivos e quero usar xargs para copiar eles uma vez, não mais vezes manualmente.

    
por zhenguoli 25.04.2016 / 17:37

1 resposta

1

Você pode fazer isso no bash ativando globbing estendido.

shopt -s extglob

e, em seguida, use as opções --parents de cp .

Então, vá para /usr/share/icons/hicolor/ e faça:

cp -R --parent {128x128,32x32}/apps ~/.local/share/icons/

Modifique os nomes de diretório em {} para atender às suas necessidades.

Por exemplo:

ron@ron:~$ tree dir1/          # Destination before copying
dir1/
├── 128x128
│   └── apps
├── 16x16
│   └── apps
├── 32x32
│   └── apps
└── 48x48
    └── apps
karthik@4736Z:~/dir2$ ls hicolor/            # Source structure
128x128  22x22    32     42x42  512x512  72x72  icons             scalable
16x16    24x24    32x32  48     64       8x8    icon-theme.cache  symbolic
192x192  256x256  36x36  48x48  64x64    96x96  index.theme
ron@ron:~/dir2$ tree hicolor/ | head -n 6
hicolor/
├── 128x128
│   ├── actions
│   ├── animations
│   ├── apps
│   │   ├── amazon-store.png
ron@ron:~/dir2/hicolor$ cd hicolor/    
ron@ron:~/dir2/hicolor$ cp -R --parent {128x128,32x32}/apps ../../dir1/
ron@ron:~/dir2/hicolor$ tree ../../dir1/          # Destination after copying
../../dir1/
├── 128x128
│   └── apps
│       ├── amazon-store.png
│       ├── chromium-browser.png
│       ├── credentials-preferences.png
│       ├── deluge.png
│       ├── display-im6.q16.png
│       ├── libreoffice-base.png
│       ├── libreoffice-calc.png
│       ├── libreoffice-draw.png
│       ├── libreoffice-impress.png
│       ├── libreoffice-main.png
│       ├── libreoffice-math.png
│       ├── libreoffice-startcenter.png
│       ├── libreoffice-writer.png
│       ├── ubuntuone-music.png
│       ├── ubuntusoftware.svg
│       ├── vivaldi.png
│       ├── vlc.png
│       └── vlc-xmas.png
├── 16x16
│   └── apps
├── 32x32
│   └── apps
│       ├── aim.png
│       ├── baobab.png
│       ├── bluetooth.png
    
por Ron 25.04.2016 / 17:58