Shell脚本获取一对一映射并重命名文件名

时间:2013-08-09 18:31:11

标签: bash shell unix awk cut

我有两个按数字排序的文件。我需要帮助shell脚本来读取这两个文件并执行1:1映射并使用映射的case重命名文件名#;

例如:

cat case.txt
10_80
10_90

cat files.txt
A BCD_x 1.pdf
A BCD_x 2.pdf

ls pdf_dir
A BCD_x 1.pdf A BCD_x 2.pdf

阅读这些2 txt并重命名pdf_dir中的pdf文件:

A BCD_x 1.pdf as A BCD_10_80.pdf
A BCD_x 1.pdf as A BCD_10_90.pdf

4 个答案:

答案 0 :(得分:2)

使用paste创建“映射”,然后使用shell工具进行重命名。

shopt -s extglob
while IFS=$'\t' read file replacement; do
    echo mv "$file" "${file/x +([0-9])/$replacement}"
done < <(paste files.txt case.txt)

当你满意时删除“echo”。

答案 1 :(得分:1)

使用awk:

awk 'FNR==NR{a[FNR]=$0;next}
  {f=$0; sub(/_x /, "_" a[FNR] " "); system("mv \"" f "\" \"" $0 "\"")}' case.txt files.txt

答案 2 :(得分:1)

使用普通数组和sed替换 - 在mv之前删除echo将为您提供移动功能。 您可以将/ path /更改为/ pdf_dir /以指定所需目录的路径

#!/bin/bash
i=0
while read line
do
    arr[i]="$line"
  ((i=i+1));
done < files.txt

i=0
while read case
do
   newFile=$(echo "${arr[i]}" | sed "s/x/"$case"/")
   echo mv /path/to/pdf_dir/"${arr[i]}" /path/to/pdf_dir/"$newFile"
   ((i=i+1))
done < case.txt

答案 3 :(得分:0)

如果你有Bash 4.0,这可能会有所帮助:

#!/bin/bash

declare -A MAP
I=0
IFS=''

while read -r CASE; do
    (( ++I ))
    MAP["A BCD_x ${I}.pdf"]="A BCD_${CASE}.pdf"
done < case.txt

while read -r FILE; do
    __=${MAP[$FILE]}
    [[ -n $__ ]] && echo mv "$FILE" "$__"  ## Remove echo when things seem right already.
done < files.txt

注意:确保以UNIX文件格式运行脚本。