在Bash中根据父目录重命名文件

时间:2017-10-28 19:22:08

标签: bash find rename

试图拼凑几个以前的帖子来完成这项任务。 目录树如下所示:

TEST
   |ABC_12345678
       3_XYZ
   |ABC_23456789
       3_XYZ
   etc

父文件夹中的每个文件夹名为" TEST"始终以ABC_ \ d {8}开头--8位数始终不同。在文件夹ABC_ \ d {8}内始终是名为3_XYZ的文件夹,该文件夹始终具有名为" MD2_Phd.txt"的文件。目标是重命名每个" MD2_PhD.txt"具有在ABC文件夹名称中找到的特定8位ID的文件,即" \ 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

2 个答案:

答案 0 :(得分:2)

您正在将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

答案 1 :(得分:2)

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