Mover arquivos baseados em nome de arquivo no diretório Ano / Mês / Dia

1

Eu tenho arquivos no formato YYYY_MM_DD_HH:MM:SS.swf que são despejados em uma pasta /home/user/dump/

Eu quero mover esses arquivos para uma nova árvore de diretórios /home/user/save/year/month/day/ com base no YYYY_MM_DD do nome do arquivo. Alternativamente, se eles puderem ser modificados pela data de modificação do arquivo, isso também é aceitável. Eu encontrei alguns outros scripts aqui, mas eles não parecem ter todas as informações que estou procurando.

    
por RickA 29.02.2016 / 22:17

4 respostas

0
while read file
 do 
     f=$(basename $file)
     year=$(echo "$f"|cut -f1 -d_)
     day=$(echo "$f"|cut -f3 -d_)
     month=$(echo "$f"|cut -f2 -d_)
     new_dir="/home/user/save/$year/$month/$day"
     mkdir -p "$new_dir"
     mv "$file" "$new_dir"
done < <(find /home/user/dump -type f -name "*_*_*_*:*:*.swf")
    
por 29.02.2016 / 22:47
3

Se você tem o rename baseado em Perl (às vezes conhecido como prename ), você pode fazer isso com um único comando:

cd /home/user/dump
rename -v 'use File::Path qw(make_path); m!^((....)_(..)_(..)_(.*))!; my $d = "$2/$3/$4"; make_path($d); s!^!$d/!' *

Na verdade, esse é um uso (feio) bastante feio de rename . Para cada arquivo, o código é executado da seguinte forma

  1. Incluir uma biblioteca do sistema que permita a criação do caminho do diretório
  2. Corresponder à estrutura YYYY_MM_DD no início do nome do arquivo
  3. Crie o caminho do diretório correspondente YYYY/MM/DD (se necessário)
  4. Mova (renomeie) o arquivo para o diretório YYYY/MM/DD , deixando o nome inalterado
por 29.02.2016 / 23:34
2

Zsh

Use a função zmv para mover ou renomear arquivos correspondidos por uma expressão curinga. Não há uma maneira interna de criar o diretório de destino, então eu forneço uma função para fazer isso.

autoload -U zmv
mkdir_mv () {
  mkdir -p -- ${(P)#:h}
  mv -- $@
}
cd /home/user/dump
zmv -p mkdir_mv '(????)_(??)_(??)_??:??:??.swf' '/home/user/save/$1/$2/$3/$f'

shell POSIX

Se você precisar de uma solução portátil, use um loop de shell sobre os arquivos e a manipulação da string do shell para extrair as partes dos nomes dos arquivos.

cd /home/user/dump
for f in ????_??_??_??:??:??.swf; do
  year=${f%%_*}; suffix=${f#*_}
  month=${suffix%%_*}; suffix=${suffix#*_}
  day=${suffix%%_*}
  mkdir -p "/home/user/save/$year/$month/$day"
  mv "$f" "/home/user/save/$year/$month/$day/$f"
done
    
por 27.12.2016 / 00:45
0
for file in $(find /home/user/dump/ -name "*.swf")
do
  year=$(echo ${file}|cut -d_ -f1)
  month=$(echo ${file}|cut -d_ -f2)
  day=$(echo ${file}|cut -d_ -f3)
  if [ ! -d /home/user/save/${year}/${month}/${day} ]
  then
    mkdir -p /home/user/save/${year}/${month}/${day}
  fi
  mv ${file} /home/user/save/${year}/${month}/${day}
done
    
por 29.02.2016 / 22:50