bash - ruta - nombres de archivos de linux
Cambiar el nombre de los archivos en función de su directorio principal en Bash (2)
Estás canalizando find
salida a otro find
. Eso no funcionará
Use un bucle en su lugar:
dir_re=''^.+_([[:digit:]]{8})/''
for file in *_????????/3_XYZ/MD2_PhD.txt; do
[[ -f $file ]] || continue
if [[ $file =~ $dir_re ]]; then
dir_num="${BASH_REMATCH[1]}"
new_name="${file%MD2_PhD.txt/$dir_num.txt}" # replace the MD2_PhD at the end
echo mv "$file" "$new_name" # remove echo from here once tested
fi
done
He intentado juntar un par de publicaciones anteriores para esta tarea. El árbol de directorios se ve así:
TEST
|ABC_12345678
3_XYZ
|ABC_23456789
3_XYZ
etc
Cada carpeta dentro de la carpeta principal llamada "TEST" siempre comienza con ABC_ / d {8} -los 8 dígitos son siempre diferentes. Dentro de la carpeta ABC_ / d {8} siempre hay una carpeta titulada 3_XYZ que siempre tiene un archivo llamado "MD2_Phd.txt". El objetivo es cambiar el nombre de cada archivo "MD2_PhD.txt" con el ID de 8 dígitos específico que se encuentra en el nombre de la carpeta ABC, es decir, "/ d {8} _PhD.txt"
Después de varias iteraciones sobre varios bits de código de diferentes publicaciones, esto es lo mejor que puedo hacer,
cd /home/etc/Desktop/etc/TEST
find -type d -name ''ABC_(/d{8})'' |
find $d -name "*_PhD.txt" -execdir rename ''s/MD2$/$d/'' "{}" /;
done
solución find
+ bash
:
find -type f -regextype posix-egrep -regex ".*/TEST/ABC_[0-9]{8}/3_XYZ/MD2_Phd/.txt" /
-exec bash -c ''abc="${0%/*/*}"; fp="${0%/*}/";
mv "$0" "$fp${abc##*_}_PhD.txt" '' {} /;
Resultados de visualización:
$ tree TEST/ABC_*
TEST/ABC_12345678
└── 3_XYZ
└── 12345678_PhD.txt
TEST/ABC_1234ss5678
└── 3_XYZ
└── MD2_Phd.txt
TEST/ABC_23456789
└── 3_XYZ
└── 23456789_PhD.txt