Procurando por um script / ferramenta para mover arquivos e subpastas para o diretório por ano

5

Recebi muitos dados ao longo dos anos e estou procurando uma ferramenta que possa obter um nome de pasta e mova todos os arquivos para subpastas por ano, como:

2005
2006
2007
etc..

Alguém conhece alguma coisa ou ferramenta semelhante?

    
por Amir Ashkenazi 05.09.2011 / 08:29

2 respostas

1

Salve este texto em um arquivo ( sort.py ) e execute-o:

./sort.py src-dir/ dst-dir/

Faz um loop pelo diretório de origem, obtém o mtime de todos os arquivos e pastas e os move para o diretório de destino. Nota: Não é recursivo! Use a seu próprio risco!

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-


import os
import sys
import shutil
from datetime import date

# Check arguments
if len(sys.argv) > 2:
    src = sys.argv[1]
    dst = sys.argv[2]
else:
    print "Arguments: ./sort.py [src] [dst]"
    sys.exit(1)

# Check paths
if not os.access(src, os.R_OK):
    print "Source path not found"
    sys.exit(2)

if not os.access(dst, os.W_OK):
    print "Destination path not found"
    sys.exit(3)

# Start sorting from root
for f in os.listdir(src):
    fpath = os.path.join(src, f)
    mtime = os.stat(fpath).st_mtime
    year = str(date.fromtimestamp(mtime).year)
    ypath = os.path.join(dst, year)
    if not os.access(ypath, os.W_OK):
        os.mkdir(ypath)

    print "Moving %s to %s" % (fpath, ypath)
    shutil.move(fpath, ypath)
    
por falstaff 05.09.2011 / 14:48
0

Uma solução usando bash .

Salve o seguinte script em ~/my-script

#!/bin/bash

dst=""
shift

for f; do
  year=$(stat -c '%y' "$f" | sed 's/-.*//')
  ext=$(sed 's/.\+\.//' <<<"$f")
  ext=
  [[ $ext == $f ]] && ext=
  dir="$dst/$year/$ext"
  mkdir -p "$dir"
  cp --backup=numbered "$f" "$dir"
done

torne-o executável e, em seguida, execute

find /path/from -type f -exec ./my-script /path/to {} +

onde /path/from e /path/to devem ser substituídos pelos diretórios de origem e de destino. Por exemplo, supondo que todos os seus dados estão em sua casa, você pode executar

find $HOME/* -type f -exec ./my-script $HOME/DocumentsByYear {} +

onde ~/DocumentsByYear e todos os subdiretórios serão criados conforme necessário. Eu coloquei como caminho de origem $HOME/* para evitar arquivos ocultos.

Se você comentar a linha com ext= , obterá, em cada subdiretório de ano, uma classificação adicional por extensão de arquivo.

O script cuida dos confrontos de nomes com o recurso de backup do comando cp .

    
por enzotib 05.09.2011 / 20:04