Mover arquivos de pastas nomeadas especificamente / mover arquivos até um nível

3

Os objetivos são mover os arquivos para fora da pasta de nível mais baixo, fazer o backup de um diretório.

Isso faz um ótimo trabalho, mas também move arquivos mais acima na hierarquia de pastas.

find . -name '*.jpg' -type f -execdir mv '{}' ../ \;

Então, se esses jpgs foram colocados em uma pasta chamada 'fotos', eu quero movê-los um nível acima, por exemplo)

../

Eu tentei alterar o parâmetro '* .jpg' para incluir a pasta e tentei usar a pasta em vez do ponto após o arquivo. Também tentei -maxdepth e -mindepth, mas eles não tiveram efeito.

EDIT: Isto é para várias pastas, ou seja, ele precisa recorrer a uma unidade inteira.

    
por JohnnyBizzle 27.05.2015 / 00:42

3 respostas

1

Mover arquivos do subdiretório mais baixo para um nível

O script abaixo pesquisa um diretório para o subdiretório menor (= sem subdiretórios) de forma recursiva e move todos os arquivos encontrados na (s) pasta (s) para um nível, como solicitado em Os objetivos são mover arquivos para fora da pasta de nível mais baixo, fazer o backup de um diretório :

#!/usr/bin/env python2
import shutil
import os
import sys

directory = sys.argv[1] 

for root, dirs, files in os.walk(directory):
    for dr in dirs:
        dr = root+"/"+dr
        # find folders without subfolders (= lowest level)
        if len(next(os.walk(dr))[1]) == 0:
            # direct superior directory
            up = dr[:dr.rfind("/")]
            # move files from lowest level one level up
            for f in os.listdir(dr):
                shutil.move(dr+"/"+f, up+"/"+f)

Para usar:

  1. Copie o script em um arquivo vazio, salve-o como reorganize.py
  2. Execute-o pelo comando:

    python /path/to/reorganize.py <directory_to_reorganize>
    

    Se o nome do seu diretório (para reorganizar) contiver espaços, use aspas:

    python /path/to/reorganize.py '<directory_to_reorganize>'
    

EDITAR

Como mencionado em um comentário, com uma pequena alteração, o script pode ser usado apenas para mover arquivos de uma pasta nome para um nível acima. A maneira mais eficaz é fazer isso diretamente após

for dr in dirs:

Então o script seria:

#!/usr/bin/env python3
import shutil
import os
import sys

directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    for dr in dirs:
        if dr == "<folder_name>":
            dr = root+"/"+dr
            # direct superior directory
            up = dr[:dr.rfind("/")]
            # move files from lowest level one level up
            for f in os.listdir(dr):
                shutil.move(dr+"/"+f, up+"/"+f)
    
por Jacob Vlijm 27.05.2015 / 14:50
1

A seguir, todos os arquivos .jpg serão movidos para seus respectivos diretórios pai, se os arquivos .jpg estiverem apenas no diretório denominado photos (pode haver vários diretórios denominados photos ):

find . -type f -path '*/photos/*' -not -path '*/photos/*/*' -name '*.jpg' \
-execdir mv -i {} .. \;

-path '*/photos/*' garantirá que o caminho contenha photos , mas os arquivos só poderão estar no diretório photos ( -not -path '*/photos/*/*' ).

Observe também que, se os diretórios não viajarem (não photos ) forem corrigidos e menores em números ou tiverem padrões específicos, talvez você também esteja interessado em -prune .

    
por heemayl 27.05.2015 / 14:37
1

Se todos os seus arquivos de destino estiverem em diretórios denominados photos , você poderá fazer algo como:

find . -type d -name photos -exec bash -c 'cd {} && mv *jpg ../' \;

Isso procurará os nomes dos diretórios photos , depois inicie um shell bash que irá cd em cada um deles e mova todos os arquivos .jpg para o diretório pai.

    
por terdon 27.05.2015 / 18:14

Tags