
Actualmente estoy intentando escribir un script que organice una lista de archivos en subdirectorios por fechas. Las fechas están contenidas en la primera línea de cada archivo en el formato YYYY-MM-DD
. Extraje la primera línea de cada archivo usando el comando head y la reemplacé -
con /
para que se convierta en YYYY/MM/DD
. Esto es para poder usarlo como ruta de archivo.
Luego quiero crear subdirectorios YYYY>MM>DD
donde, por ejemplo, el archivo que contiene la fecha 2015/10/19
se almacena en la ruta del archivo ./2015
-> ./2015/10
-> ./2015/10/19
. Estos subdirectorios deben crearse en formato ~/fileList/
.
Este es el código que tengo hasta ahora.
for file in ~/fileList/*
do
head -1 $file | tr "-" "/")
done
Este es un archivo de muestra
2001-02-03
Thursday
Paris
44952
Estoy luchando por encontrar una manera de crear subdirectorios y almacenar cada archivo en el directorio correcto. Cualquier sugerencia de código será muy apreciada.
Estoy usando el shell bash.
Respuesta1
Lo siguiente debería hacer:
for file in ~/fileList/*
do
newpath=$(head -1 "$file" | tr '-' '/')
mkdir -p "$newpath"
echo "would now execute 'mv $file $newpath'"
done
Esto almacenará la fecha transformada en la variable $newpath
y creará ese directorio junto con los padres faltantes si aún no existe. El subdirectorio se creará en el directorio donde ejecuta el script.
En su forma actual imprimirá el comando que se ejecutará. Cuando esté satisfecho, cambie a
mv "$file" "$newpath"
Actualizar:Dado que usted indicó que los directorios de destino se ubicarán debajo del directorio de origen donde residen originalmente sus archivos, es necesario realizar comprobaciones para garantizar que, si ejecuta el script varias veces, no se tope con estas entradas recién generadas.
- Si puedes identificar los archivos por su extensión (por ejemplo
.txt
), puedes hacer que el bucle sea más específico:for file in ~/fileList/*.txt do newpath=~/fileList/$(head -1 "$file" | tr '-' '/') ... done
- De lo contrario, una forma es aceptar sólo archivos normales como operandos:
for file in ~/fileList/* do if [[ ! -f $file ]]; then continue; fi newpath=~/fileList/$(head -1 "$file" | tr '-' '/') mkdir -p "$newpath" mv "$file" "$newpath" done