我有一个包含1000个文件的文件夹。
他们的名字如下所示
QET2_ P1_A1 _R2 ....
QEX2_ P2_C10 _R2 ....
... QEX2_P5_B3_R2
只有中间是重要的突出显示
我在此信息的同一文件夹中有一个密钥.txt文件
Sample P R Col
1 1 A 1
2 1 A 2
3 1 A 3
4 2 A 1
5 2 A 2
6 2 C 10
4 2 A 1
5 2 A 2
我想检查.txt文件并相应地更改文件名,或者在另一个文件夹中使用名称保存。例如
.._ P1_A1 _ ..
应该是sample1,因为当我查看.txt文件时,它是
Sample P R Col
1 1 A 1
代表..P2_C10 ..
应该是sample6,因为当我查看.txt文件时,它是
Sample P R Col
6 2 C 10
要手动更改每个名称,我可以例如
mv *_P1_A1* sample1
我也尝试使用awk
awk '-f {print "mv *_P"$2"_"$3$4"* sample"$1}' key.txt
但我无法弄清楚,
答案 0 :(得分:1)
您可以使用此纯粹的bash脚本:
while read -d $'\r' -r c1 c2 c3 c4; do
f="*_P${c2}_${c3}${c4}_*"
fname=$(compgen -G "$f") && mv "$fname" "sample$c1"
done < key.txt
-d $'\r'
中的read
用于根据您的问题划分\r
上的每一行。
compgen -G
用于扩展bash
中的glob模式。compgen -G
返回成功时,我们才会执行展开文件名的mv
。答案 1 :(得分:1)
仅依赖POSIX sh(非bash)功能,可以执行以下操作:
tr '\r' '\n' <key.txt | while read -r c1 c2 c3 c4 _; do
: c1="$c1" c2="$c2" c3="$c3" c4="$c4"
set -- *"_P${c2}_${c3}${c4}"*
if [ "$#" -eq 1 ] && [ -e "$1" ]; then
mv -- "$1" "sample${c1}.txt"
fi
done
答案 2 :(得分:0)
我会编写一个如下脚本,但请记住,它肯定不是最高性能的解决方案:
#!/bin/bash
keys=$(tail -n+2 key.txt | tr '\t' ' ' | tr -s ' ')
for f in QEX*; do
id=$(echo "$f" | cut -d_ -f3)
sample=$(echo "$keys" | grep "${id:0:1} ${id:1}" | head -n1)
sample=${sample%% *}
new_name="sample$sample"
echo mv "$f" "$new_name" # remove the echo when you're sure it works
done