如何重命名文件夹

时间:2016-12-07 12:20:11

标签: bash macos shell

我有一个包含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 

但我无法弄清楚,

3 个答案:

答案 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
    {li} -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