Altera a estrutura de diretórios de / ANO / MÊS / DIA / para / ANO MÊS-DIA

1

Eu preciso alterar minha estrutura de diretórios para minhas fotos de / ANO / MÊS / DIA / para / ANO MÊS-DIA

Eu sei que isso pode ser feito com exiftool , mas ele só funcionará em arquivos que contenham tags EXIF, e eu tenho arquivos xmp-sidecar correspondentes a cada imagem, e eles também precisam aparecer. Então eu reconto algum tipo de script seria o melhor caminho.

Eu sentei e tentei aprender RegEx, sed , bash e o que não, e com tempo suficiente, acho que deveria ser capaz de descobrir isso, mas agora estou com pressa, então qualquer ajuda seria apreciado.

// Ola

    
por Ola 14.06.2014 / 16:21

4 respostas

4

O utilitário rename no Ubuntu pode renomear estruturas de diretórios, mas ele não será limpo após ele mesmo.

rename 's#(.+)/(.+)/(.+)#--#' */*/*/

Cole -vn no final se quiser que ele lhe diga o que vai fazer antes de renomear qualquer coisa, mas aqui está um pequeno arnês de testes que mostra o que é possível:

$ mkdir -p 2014/06/15
$ touch 2014/06/15/photo_{001..003}.jpg
$ tree
.
└── 2014
    └── 06
        └── 15
            ├── photo_001.jpg
            ├── photo_002.jpg
            └── photo_003.jpg

$ rename 's#(.+)/(.+)/(.+)#--#' */*/*/
$ tree
.
├── 2014
│   └── 06
└── 2014-06-15
    ├── photo_001.jpg
    ├── photo_002.jpg
    └── photo_003.jpg

Simplificando, ele está sendo alimentado pelos diretórios de terceiro nível e renomear é ler os dois segmentos anteriores e renomeá-lo, colando-o no diretório atual. Como você pode ver, haverá uma carga de diretórios de ano. Assumindo que eles estão vazios, você poderia limpar com algo parecido (e eu oro para você verificar se eles estão vazios primeiro):

find -maxdepth 1 -type d -regex '\./[0-9][0-9][0-9][0-9]' -exec rm -irf "{}" \;

Estou usando a opção -i para forçá-lo a perguntar antes de excluir todos os arquivos. Remova isso por sua conta e risco.

    
por Oli 15.06.2014 / 13:21
2
cd base
# the trailing slash in the pattern limits the results to directories, not files
for subdir in */*/*/; do
    # $subdir is now "year/mon/day/"
    subdir=${subdir%/}        # remove the trailing slash
    newdir=${subdir//\//-}    # replace all slashes with hyphens
    mkdir "$newdir"
    mv "$subdir"/* "$newdir"
done
    
por glenn jackman 14.06.2014 / 17:50
0

Tente isto:

    TOP=$PWD
for y in *; do
  if cd $y; then
    for m in *; do
      if cd $m; then
           for d in *; do
          if cd $d; then
            mv $d $TOP/$y-$m-$d -R 
          fi
        done
        cd .. && rmdir $m
      fi
    done
    cd .. && rmdir $y
  fi
done
    
por muru 14.06.2014 / 17:23
0
$ fn="/media/drive/folder/2014/06/14/name.jpg" ; \
echo "mv $fn $(echo $fn | sed -re 's,([0-9]+)/,-,g')"
mv /media/drive/folder/2014/06/14/name.jpg /media/drive/folder/2014-06-14-name.jpg
$ find -type f | tee LISTOFFILES.txt
$ cat LISTOFFILES.txt | while read p  ; do # loop through all files, one at a time
f="${p##*/}" ; bn=${f%%\.*} ; op="${p%/*}/" ; 
echo -e "$f\n$bn\n$op"
# $p - complete path to original file
# $f - filename with extension
# $bn - basename, filename without extension
# $op - orignal PATH, filename and extensions stripped off

# add your conversion here - based on the above
# mkdir -p "$p" # probably required
# mv "$p" "..." # 
done

Agora, se você leu o acima THOROUGHLY, encontrará todos os fragmentos necessários para realizar essa tarefa.

Como eu não posso dizer como você tem, nem como você quer - eu não posso terminar isso para você.

link
tem DOIS guias de Bash para ler e examinar - experimente.

Estou deixando aqui. Isso é não um serviço, eu fiz isso apenas por curiosidade.
E lembre-se - pode haver falhas lá, como eu não testei totalmente.
Você pode apresentar falhas que você não pensou em ... :-)

Boa sorte! ;-) você precisa disso.

    
por Hannu 14.06.2014 / 17:35