在Bash中根據父目錄重命名文件




find rename (2)

一直在試圖拼湊一些先前的帖子來完成這個任務。 目錄樹看起來像這樣:

TEST
   |ABC_12345678
       3_XYZ
   |ABC_23456789
       3_XYZ
   etc

名為“TEST”的父文件夾中的每個文件夾總是以ABC_ \ d {8}開頭 - 8位數字總是不同的。 文件夾ABC_ \ d {8}內總是有一個名為“3_XYZ”的文件夾,它總是有一個名為“MD2_Phd.txt”的文件。 目標是使用在ABC文件夾名稱中找到的特定8位數字ID來重命名每個“MD2_PhD.txt”文件,即“\ d {8} _PhD.txt”

經過不同職位的代碼不同位的幾次迭代,這是最好的,我可以拿出來,

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

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

查看結果:

$ 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

你正在管道find輸出到另一個find 。 這是行不通的。

改用循環:

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






rename