Necesito mover archivos leyendo sus nombres.
Necesito mover archivos generados por el sistema y los nombres incluyen una marca de tiempo. Necesito mover los archivos leyendo el nombre del archivo por mes.
Si el nombre del archivo contiene 201601*.txt
, luego vaya a 2016/January
directorio. Si el nombre del archivo contiene 201602*.txt
luego pase a 2016/February
directorio, etc.
Respuesta aceptada:
Bueno, si las cadenas de fecha están en los nombres de los archivos y todos los archivos están en el mismo directorio, podrías hacer:
mv 201601*.txt 2016/January
Hacer esto 12 veces manualmente sería una molestia, así que crearía una lista con el número y el nombre del mes correspondiente:
$ paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}')
01 January
02 February
03 March
04 April
05 May
06 June
07 July
08 August
09 September
10 October
11 November
12 December
Y luego analizarlo para construir el mv
comandos:
$ paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}') |
while read num month; do echo mv "*2016$num*" 2016/"$month"; done
mv *201601* 2016/January
mv *201602* 2016/February
mv *201603* 2016/March
mv *201604* 2016/April
mv *201605* 2016/May
mv *201606* 2016/June
mv *201607* 2016/July
mv *201608* 2016/August
mv *201609* 2016/September
mv *201610* 2016/October
mv *201611* 2016/November
mv *201612* 2016/December
Una vez que esté seguro de que hace lo que necesita, elimine el echo
para mover realmente los archivos:
paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}') |
while read num month; do echo mv "*2016$num*" 2016/"$month"; done
Explicación
El grep -Po 's+K[A-Z]w{2,}')
ejecutará grep
con expresiones regulares compatibles con Perl (-P
) e imprimirá solo las partes coincidentes de cada línea (-o
). La expresión regular utilizada buscará uno o más caracteres de espacio en blanco (s+
) seguido de una letra mayúscula ([A-Z]
) y 2 o más caracteres de palabra (w{2,}
). El K
significa "ignorar todo antes de esto", lo que hará que el comando solo imprima la parte de las cadenas coincidentes después el espacio en blanco. Todo simplemente imprime la lista de meses.