Questão Movendo todos os arquivos de um determinado tipo ou extensão


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?


2
2017-08-08 19:58


origem


stackoverflow.com/questions/18338322/… - dan08
Isso parece semelhante ao que eu estou tentando fazer, só eu gostaria de ter movido todos os arquivos encontrados para outro diretório. Desculpe, sou muito novo na linha de comando e não sei como mudar isso para fazer isso sozinho. - Daniel


Respostas:


Eu tentaria algo como ...

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

Você tem que adicionar todas as extensões que você deseja procurar no regex se você 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.


1
2017-08-08 20:04



Isso parece perfeito, agora como eu especifico em encontrar para dizer onde procurar? - Daniel
você quer dizer find /path/to/your/target/directory, onde o caminho para o diretório de destino é algo como / home / username / Music ou / home / username / Video. a instância acima de onde eu usei find /, especifica que find deve iterar através de todo o sistema de arquivos disponível, o que é praticamente desnecessário, mas a saída é boa. - blanket_cat
São esses suportes e citações certo? - Tim
Eles são agora, boa pegada. - blanket_cat


Eu não sou realmente certo você deseja mover muitos arquivos de vários diretórios, mas aqui está o comando básico para localizar arquivos de várias 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 pegar mais -o -iname ... até que você tenha 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 o caso) e, em seguida, apenas passando-os para mv em um simples for loop:

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

1
2017-08-10 00:00





Eu recomendo 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 de inclusões com algo como o seguinte e deixar a seção de exclusões intacta. A seguir, você moverá apenas arquivos mp3, avi e jpg:

*.mp3
*.avi
*.jpg

Ou, se você deixar o * na seção includes, você pode dizer quais arquivos você 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 tendo apenas a seta verde selecionada, procure por qualquer um que possa ser movido, mas não queira ser, e modifique os filtros de acordo.


0
2017-08-08 20:13





Você poderia 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 sobrescrever possíveis duplicados (e renomeá-los)

Se houver um 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)

Neste caso, várias ocasiões de file.mp3 será renomeado para:

file.mp3
file_1.mp3
file_2.mp3
...etc.

0
2017-08-10 06:56