Como copiar ou mover arquivos -n níveis acima no OSX via shell

2

Como posso encontrar todos os arquivos de determinado tipo / nome e copiá-los -n levels up ? Aqui está a estrutura da árvore do sistema de arquivos:

germany/
       |
       adventure/
                |
                300x600/
                |      |
                |      file1.jpg
                |      file2.zip
                |
                400x600/
                       |
                       file8.jpg
                       file4.zip
switzerland/
           |
           adventure/...

Existem muitas pastas de países, cerca de 20 e os arquivos .zip não têm garantia de profundidade de 3 níveis. No momento, estou na pasta pai, countries/ , e desejo encontrar e copiar todos os arquivos .zip no nível um , para o diretório adventure/ do país apropriado / pasta.

Eu tentei:

find . -type f -name '*.zip' -exec mv {}/.. \;

mas esse falhou miseravelmente. Ele moveu cada arquivo para cima um nível, depois estes foram movidos novamente em um nível.

Obrigado!

EDITAR: Eu joguei um pouco com as soluções das respostas e li um monte de man páginas :). Finalmente aceitei a solução que mais gostei, pois é elegante e independente de shell.

Algo que ainda estou tentando descobrir:

  1. O find funciona como um loop ou os chaves são tratados como "lista / matriz" em outras linguagens de programação? Significado: ele é preenchido com os resultados encontrados (ou seja, strings) de uma só vez e, em seguida, passou para o comando em -exec ?
  2. Por que a mudança aconteceu primeiro um nível acima e, em seguida, novamente um nível acima?
  3. Existe uma maneira de dizer imediatamente mv/cp para ir -n níveis [up / down]?
por Alex Starbuck 19.08.2016 / 16:09

3 respostas

0

Você pode torná-lo independente de shell e condensá-lo em um comando find :

find . -type f -name '*.zip' -exec \
sh -c 'echo cp -- "$0" "$(dirname "$0")"/..' {} \;

Remova o echo quando tiver certeza de que ele faz o que você deseja.

Use find para localizar os arquivos. Execute um shell com -exec sh -c , passando o arquivo encontrado com {} como o primeiro argumento para esse shell. O shell terá, portanto, o caminho do arquivo disponível como $0 .

Você pode usar dirname "$0" e uma substituição de comando ( $(…) ) para obter a diretório pai do arquivo. Acrescente o máximo de /.. que você deseja percorrer mais.

Observe que citou os nomes dos arquivos para evitar que arquivos com novas linhas ou espaços em seus nomes sejam expandidos incorretamente .

    
por 19.08.2016 / 18:00
0

tentei com o Ubuntu zsh 5.0.2:

for pdir in */
do
  cd $pdir
  for dir in */
  do
    cd $dir
    mv */*.zip .
    cd ..
  done
  cd ..
done
    
por 19.08.2016 / 16:28
0

Apenas a alternativa rápida se a realidade é tão simples como o exemplo dado:

cd germany
mv */*/*.zip .

(e não há zilhões de arquivos)

    
por 19.08.2016 / 21:32