Mueva los files basados ​​en el nombre de file al directory Año / Mes / Día

Tengo files en el formatting YYYY_MM_DD_HH:MM:SS.swf que se vuelcan en una carpeta /home/user/dump/

Quiero mover estos files a un nuevo tree de directorys /home/user/save/year/month/day/ basado en el YYYY_MM_DD del nombre del file. Alternativamente, si estos pueden ser modificados por la date de modificación del file, eso también es aceptable. He encontrado algunos otros scripts aquí, pero parece que no tienen toda la información que estoy buscando.

 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") 

Si tiene el rename basado en Perl (a veces conocido como prename ) puede hacerlo con un solo command:

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

En realidad, este es un uso bastante feo (incorrecto) de rename . Para cada file, el código se ejecuta de la siguiente manera

  1. Incluye una biblioteca de sistema que permite la creación de routes de directory
  2. Coincide con la estructura YYYY_MM_DD al comienzo del nombre de file
  3. Cree la ruta de directory correspondiente YYYY/MM/DD (si es necesario)
  4. Mueva (renombre) el file a su directory YYYY/MM/DD , sin cambiar su nombre

Zsh

Use la function zmv para mover o cambiar el nombre de los files que zmv con una expresión de comodín. No existe una forma integrada de crear el directory de destino, por lo que proporciono una function para hacerlo.

 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

Si necesita una solución portátil, use un bucle de shell en los files y la manipulación de cadenas de shell para extraer las partes de los nombres de los files.

 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 
 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