如何查找多个文件、检查重复文件并用 bash、sed 脚本替换

Posted

技术标签:

【中文标题】如何查找多个文件、检查重复文件并用 bash、sed 脚本替换【英文标题】:How to find multiple files, check for duplicates and replace with bash,sed script 【发布时间】:2021-12-06 08:22:13 【问题描述】:

我正在寻找一个脚本,它可以帮助我在 bash 和 sed 命令的帮助下搜索具有扩展名 (.bak.alt) 的文件,然后更改文件的名称,如果它不存在的话.我的意思是搜索(*.bak.alt *.BAK.alt *.bak) 并用 (*.BAK) 替换它,如果它不存在并且应该在将它与旧的更改后比较新的然后做出反应, 如果它的内容和名称相同,则什么都不做,否则就改变它。

我在朋友的帮助下想出了一些东西,但它并不完整。

#!/bin/bash

        echo " Finds something.."

        find . -type f \( -name "*.bak.alt" \) > F1.txt
        cat F1.txt
        find . -type f \( -name "*.BAK.alt" \)> F2.txt
        cat F2.txt

        if diff F1.txt F2.txt
                then echo "everythings looks good":
        else
              sed -E 's/^\(.*)\.(bak|BAK)\.alt$/mv "&" "\1.BAK"/;e'| wc -l    echo " Files changed "
fi

参考: Rename series of files with 2 extentions by help of sed

【问题讨论】:

【参考方案1】:

你需要这样的东西(未经测试):

#!/usr/bin/env bash
shopt -s nocasematch

while IFS= read -r old; do
    new="$old/%.alt"
    new="$new/%.bak"
    [[ ! -e "$new" ]] && echo mv -- "$old" "$new"
done < <( find . -type f \( -name '*.bak.alt' -o -name '*.BAK.alt' -o -name '*.bak' \) )

完成测试后删除echo,并希望它实际执行mv

【讨论】:

谢谢 Ed,这很好,但实际上我想搜索这样的文件:*.bak.alt *.BAK.alt *.bak 如果它不存在,则用 .BAK 替换它 好吧,这不是你的脚本看起来的样子。请编辑您的问题以提供示例输入和预期输出。 现在明白了吗?? 然后编辑您的问题以将该参考以及包含为示例输入/输出,以便您的问题独立存在。 AFAIK 我的回答符合您的要求,因此请参阅***.com/help/someone-answers 了解下一步该做什么。

以上是关于如何查找多个文件、检查重复文件并用 bash、sed 脚本替换的主要内容,如果未能解决你的问题,请参考以下文章

BASH:在文本之间查找换行符并用两个换行符替换

如何从bash中的多个文件名中删除公共前缀模式[重复]

使用 Bash 查找和复制文件 [重复]

递归查找重复文件(bash4,关联数组)

检查文件是不是存在Linux bash [重复]

如何在bash中使用多个ifs遍历多个目录?