【问题标题】:Shell script to get one to one map and rename the filename用于获取一对一映射并重命名文件名的 Shell 脚本
【发布时间】:2013-08-11 18:40:21
【问题描述】:

我有 2 个按数字排序的文件。我需要 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

阅读这两个 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

【问题讨论】:

    标签: bash shell unix awk cut


    【解决方案1】:

    如果您有 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 文件格式运行脚本。

    【讨论】:

      【解决方案2】:

      使用 awk:

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

      【讨论】:

        【解决方案3】:

        使用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)
        

        满意后删除“回声”。

        【讨论】:

          【解决方案4】:

          使用普通数组和 sed 替换 - 在 mv 之前删除 echo 将为您提供移动功能。 您可以更改 /path/to/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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-21
            • 2011-04-20
            • 2014-08-03
            • 1970-01-01
            • 2011-06-19
            • 2016-03-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多