titel - Benennen Sie Dateien basierend auf ihrem übergeordneten Verzeichnis in Bash um




ubuntu terminal titel (2)

Ich habe versucht, ein paar frühere Beiträge für diese Aufgabe zusammenzustellen. Die Verzeichnisstruktur sieht folgendermaßen aus:

TEST
   |ABC_12345678
       3_XYZ
   |ABC_23456789
       3_XYZ
   etc

Jeder Ordner im übergeordneten Ordner mit dem Namen "TEST" beginnt immer mit ABC_ \ d {8} - die acht Ziffern unterscheiden sich immer. Innerhalb des Ordners ABC_ \ d {8} befindet sich immer ein Ordner mit dem Namen 3_XYZ, der immer eine Datei namens "MD2_Phd.txt" enthält. Das Ziel besteht darin, jede "MD2_PhD.txt" -Datei mit der spezifischen 8-stelligen ID umzubenennen, die sich im ABC-Ordnernamen befindet, zB "\ d {8} _PhD.txt"

Nach mehreren Wiederholungen verschiedener Code-Codes aus verschiedenen Posts ist dies das Beste, was ich mir vorstellen kann.

cd /home/etc/Desktop/etc/TEST
find -type d -name 'ABC_(\d{8})' |
find $d -name "*_PhD.txt" -execdir rename 's/MD2$/$d/' "{}" \;
done

Sie leiten find Ausgabe an einen anderen find . Das wird nicht funktionieren.

Benutze stattdessen eine Schleife:

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

find + bash Lösung:

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" ' {} \;

Ergebnisse anzeigen:

$ 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




rename