Mover todos os arquivos de um determinado tipo ou extensão

2

Eu tenho um grande externo com muitas subpastas que eu quero mover todos os vídeos, fotos e músicas para outro disco rígido, qual seria a melhor maneira de fazer isso?

    
por Daniel 08.08.2014 / 21:58

4 respostas

1

Eu tentaria algo como ...

for files in $(find / | grep -P "([.]mp3$)|([.]avi$)")
do
cp $files /media/<your_external_drive>/target_folder/
done

Você precisa adicionar todas as extensões que deseja pesquisar no regex se quiser fazer tudo de uma só vez.

Ou se você simplesmente quer mover os diretórios, você pode usar,

cp -r /target/dir/on/machine /target/dir/on/external/drive

para cada diretório que contém seus arquivos de mídia.

    
por blanket_cat 08.08.2014 / 22:04
1

Eu não tenho certeza que você deseja mover muitos arquivos de vários diretórios, mas aqui está o comando básico para encontrar arquivos de múltiplas extensões em uma estrutura de diretórios:

find /path/to/look/ -type f \( -iname \*.mp3 -o -iname \*.avi -o -iname \*.mp4 \)

Você obviamente vai querer colocar mais -o -iname ... nisso até ter certeza de encontrar todos os arquivos desejados. Quando você tiver tudo, basta adicionar isso ao final:

-exec mv -t /path/to/destination {} +

E isso vai movê-los para o diretório especificado.

Uma forma Bashier de fazer isso seria usar alguns modificadores globbing ( globstar para pesquisa recursiva com ** , nullglob para retornar apenas arquivos válidos e nocaseglob para ignorar maiúsculas e minúsculas) e, em seguida, apenas transferindo-os para mv em um simples loop for :

shopt -s globstar nullglob nocaseglob
for f in /path/to/look/{**/,}*.{mp3,avi,mp4}; do
  mv "$f" /path/to/destination/
done
    
por Oli 10.08.2014 / 02:00
0

Eu recomendo strongmente o programa FreeFileSync . É ótimo não só para sincronizar dois diretórios, mas também para a tarefa que você tem em mente. Você pode adicionar filtros para incluir ou excluir padrões. Primeiro você navega até a origem à esquerda e o destino à direita. Em seguida, clique em comparar para pesquisar todos os seus arquivos. Por fim, clique no funil vermelho na parte superior para editar os filtros.

Para os filtros, você coloca cada padrão em uma nova linha. Você pode substituir o * na seção includes por algo como o seguinte e deixar a seção de exclusões intacta. O seguinte moverá apenas arquivos mp3, avi e jpg:

*.mp3
*.avi
*.jpg

Ou, se você deixar o * na seção includes, poderá dizer quais arquivos não deseja mover. O seguinte, adicionado à seção de exclusões, moverá tudo, exceto os arquivos txt, odt e pdf:

*.txt
*.odt
*.pdf

Depois de fazer as alterações e fechar a caixa de diálogo do filtro, os arquivos que não serão movidos ficarão esmaecidos. Os botões na parte inferior ao lado de "Selecionar Visualização:" permitem que você altere quais arquivos são exibidos (esses botões não afetam quais arquivos serão movidos). Exibindo apenas os arquivos "Do nothing", tendo apenas a barra cinza selecionada, procure qualquer um que você deseja mover que não será e modifique os filtros de acordo. Da mesma forma, exibindo apenas os arquivos a serem movidos com apenas a seta verde selecionada, procure por qualquer um que possa ser movido, mas não queira ser, e modifique os filtros de acordo.

    
por TheSchwa 08.08.2014 / 22:13
0

Você pode usar um script Python simples para fazer o trabalho:

#!/usr/bin/env python3

import os
import shutil

source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")

for root, dirs, files in os.walk(source_dir):
    for name in files:
        if name.endswith(extensions):
            file = root+"/"+name
            shutil.move(file, target_folder+"/"+name)

Cole o código acima em um arquivo de texto vazio, insira os diretórios de destino e de origem, insira as extensões de arquivo que deseja mover, salve-o como move.py e execute-o pelo comando:

python3 /path/to/move.py

Para evitar a substituição de possíveis duplicados (e renomeá-los)

Se houver o risco de o diretório conter duplicatas (nomes) que você deseja manter, o código será um pouco mais extenso:

#!/usr/bin/env python3

import os
import shutil

source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")

dup = 1
for root, dirs, files in os.walk(source_dir):
    for name in files:
        if name.endswith(extensions):
            file = root+"/"+name
            while os.path.exists(target_folder+"/"+name):
                name = name[:name.rfind(".")]+"_"+str(dup)+name[name.rfind("."):]
                dup = dup+1
            shutil.move(file, target_folder+"/"+name)

Nesse caso, várias ocasiões de file.mp3 serão renomeadas para:

file.mp3
file_1.mp3
file_2.mp3
...etc.
    
por Jacob Vlijm 10.08.2014 / 08:56