saber ruta nombres manipulación manejo directorios directorio conocer completa como comandos archivos archivo bash find rename

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