根据另一个目录中文件的匹配子字符串重命名一个目录中的所有文件

时间:2019-07-02 02:46:15

标签: bash awk

我想根据当前文件名的匹配子字符串将一个目录中的所有文件重命名为另一目录中文件的完整文件名。例如,我有两个包含1200个文件的目录,类似于以下示例,在该示例中,我希望根据唯一的匹配ID /子字符串将第二个文件目录重命名为完整文件名:

Directory 1:
ABC_MA123.bed
EFG_MA124.bed
XYZ_MA125.bed

Directory 2:
MA123.bed
MA124.bed
MA125.bed

所需结果:

Directory 2:
ABC_MA123.bed
EFG_MA124.bed
XYZ_MA125.bed

是否有使用bash / awk脚本执行此操作的简单方法?

2 个答案:

答案 0 :(得分:0)

您确定目录2中的每个文件与目录1中的文件完全匹配吗?

您可以执行以下操作,假设目录为/ tmp / 1和/ tmp / 2:

(cd /tmp/2; ls -1) | 
(cd /tmp/1; while read f2; do f1=(/tmp/1/*$f2); echo mv $f2 ${f1##*/}; done) 

对于目录2中的每个文件,请在目录1中找到一个具有相同后缀的文件,然后将目录2中的文件重命名为目录1中匹配的文件的名称。${f1##*/}将路径从f1

答案 1 :(得分:0)

假设dir2中的文件名是dir1中文件名的子字符串,那么简单的globing应该可以:

d1="/full/path/to/dir1"
d2="/full/path/to/dir2"

cd "$d2"
for f2 in *; do
    f1=("$d1"/*"$f2"*)
    if [[ ${#f1[@]} != 1 ]]; then
        printf "ERROR: multiple matches: %s\n" "$f2" 1>&2
    elif [[ ! -f $f1 ]]; then
        printf "ERROR: no match: %s\n" "$f2" 1>&2
    else
        new="${f1##*/}" # strip to bare filename
        if [[ $f2 == $new ]]; then
            printf "WARNING: no change: %s\n" "$f2" 1>&2
        elif [[ -f $new ]]; then
            printf "ERROR: exists: %s\n" "$new" 1>&2
        else
            mv "$f2" "${f1##*/}"
        fi
    fi
done