通过从文件中提取新名称来重命名文件

时间:2014-07-14 11:12:22

标签: bash rename command-line-interface

我有一堆文件需要重命名,新名称在文本文件中。

示例文件名:

ASBC_Fishbone_Ia.pdf

文本文件中的示例条目:

Ia. Propagation—Design Considerations

预期的新文件名:

Ia. Propagation—Design Considerations.pdf

Ia._Propagation—Design_Considerations

使用典型的linux cli工具实现这一目标的好方法是什么?我正在考虑ls,grep和rename的组合吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试:

#!/bin/bash

# Do not allow the script to run if it's not Bash or Bash version is < 4.0 .
[ -n "$BASH_VERSION" ] && [[ BASH_VERSINFO -ge 4 ]] || exit 1

# Do not allow presenting glob pattern if no match is found.
shopt -s nullglob

# Use an associative array.
declare -A MAP=() || exit 1

while IFS=$'\t' read -r CODE NAME; do
    # Maps name with code e.g. MAP['Ia']='Propagation—Design Considerations'
    MAP[${CODE%.}]=$NAME
done < /path/to/text_file

# Change directory. Not needed if files are in current directory.
cd "/path/to/dir/containing/files" || exit 1

for FILE in *_*.pdf; do
    # Get code from filename.
    CODE=${FILE##*_} CODE=${CODE%.pdf}

    # Skip if no code was extracted from file.
    [[ -n $CODE ]] || continue

    # Get name from map based from code.
    NAME=${MAP[$CODE]}

    # Skip if no new name was registered based on code.
    [[ -n $NAME ]] || continue

    # Generate new name.
    NEW_NAME="${CODE}. $NAME.pdf"

    # Replace spaces with _ at your preference. Uncomment if wanted.
    # NEW_NAME=${NEWNAME// /_}

    # Rename file. Remove echo if you find it correct already.
    echo mv -- "$FILE" "$NEW_NAME"
done