试图拼凑几个以前的帖子来完成这项任务。 目录树如下所示:
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
答案 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