用于多个复制 1 个文件并重命名为新名称的 Bash 脚本

Bash script for multiple copy 1 file and rename to new name

提问人:Miss aya 提问时间:10/27/2023 最后编辑:Miss aya 更新时间:10/27/2023 访问量:68

问:

我想创建 bash 脚本,用于将源目录中的 1 个文件多次复制到目标目录,并根据我的配置文件用特定的运行编号重命名它。

示例:源目录 --> /srv/test/ (有 3 种类型的文件)

  • AB-测试-A1000000001_20230908005727724.tar
  • 交流误差B1000000009_20230908005727724.tar
  • AD-BUG-K8000000000_20230908005727724.tar

目标目录 --> /srv/rename

在我的配置文件内容中(从文件名复制;份数;新的运行编号;重命名 2 前面字符)

config_rename.txt

  • AB-测试-A1000000001_20230908005727724.tar;2;A1000000001;12
  • 交流错误B1000000009_20230908005727724.tar;3;B1000000009;YX系列

配置文件的期望值(config_rename.txt)

目标目录 --> /srv/rename 从此文件复制 2 个 AB-TEST-A1000000001_20230908005727724.tar 并重命名它

  • 12-测试A1000000001_20230908005727724.tar
  • 12-测试A1000000002_20230908005727724.tar

目标目录 --> /srv/rename 从此文件复制 3 个 AC-ERROR-B1000000009_20230908005727724.tar 并重命名它

  • YX错误B1000000010_20230908005727724.tar
  • YX错误B1000000011_20230908005727724.tar
  • YX错误B1000000012_20230908005727724.tar

我正在尝试使用它,但不确定如何根据配置文件重命名文件

    cat $Conf_File | while read line
do
for file in "$Source_directory"/*; do 
 f="${file##*/}" 
[[ -f "$file" ]] && cp "$file" "$Destination_directory/$f"
done
done
bash 循环 复制

评论

0赞 Miss aya 10/27/2023
谢谢@Adesoji Alu,我尝试了这个错误行26:10#A1000000001:基本值太大(错误令牌为“10#A1000000001”) 第26行:10#A1000000001:基本值太大(错误令牌为“10#A1000000001”) 在目标目录中 --> /srv/rename 只有这 1 个文件,如果基于config_rename.txt它应该有 2 个文件 12-TEST-A1000000001__1.0_20231013005442590.tar

答:

0赞 yanyong 10/27/2023 #1

a.sh

#!/bin/bash
f=(`ls test`)  #file array
r=(`cat config_rename.txt`)  #rule array

for((i=0;i<${#f[*]};i++))
do
  f0=${f[i]#*-}  #example: TEST-A1000000001_20230908005727724.tar
  f1=${f0%-*}  #type of file, example: TEST
  f2=${f[i]##*_}  #example: 20230908005727724.tar
  for((j=0;j<${#r[*]};j++))
  do
    r_tmp=(${r[j]//;/ })  #temp array, example: r_tmp=(AB-TEST-A1000000001_20230908005727724.tar 2 A1000000001 12)
    f3=${r_tmp[2]%%[0-9]*}  #example: A
    f4=${r_tmp[2]##*[A-Za-z]}  #example: 1000000001
    if [[ ${f[i]} == ${r_tmp[0]} ]];then
      #while((r_tmp[1]--))
      for((k=0;k<${r_tmp[1]};k++))
      do
        f5=${f3}$((${f4}+k))
        cp test/${f[i]} rename/${r_tmp[3]}-${f1}-${f5}_${f2}
      done
    fi
  done
done

例:

$ find
.
./test
./test/AD-BUG-K8000000000_20230908005727724.tar
./test/AC-ERROR-B1000000009_20230908005727724.tar
./test/AB-TEST-A1000000001_20230908005727724.tar
./rename
./a.sh
./config_rename.txt
$ bash a.sh && find
.
./test
./test/AD-BUG-K8000000000_20230908005727724.tar
./test/AC-ERROR-B1000000009_20230908005727724.tar
./test/AB-TEST-A1000000001_20230908005727724.tar
./rename
./rename/YX-ERROR-B1000000009_20230908005727724.tar
./rename/YX-ERROR-B1000000011_20230908005727724.tar
./rename/YX-ERROR-B1000000010_20230908005727724.tar
./rename/12-TEST-A1000000001_20230908005727724.tar
./rename/12-TEST-A1000000002_20230908005727724.tar
./a.sh
./config_rename.txt
$ cat config_rename.txt
AB-TEST-A1000000001_20230908005727724.tar;2;A1000000001;12
AC-ERROR-B1000000009_20230908005727724.tar;3;B1000000009;YX