将命令行中的文件替换为特定字符串

将命令行中的文件替换为特定字符串

我需要搜索(在整个磁盘上)并将一个文件替换(在匹配的情况下)另一个文件(两者都在同一路径中)。

例子:

  Folder 1
    x*.txt (good) (e.g.: xFile.txt)
    *.txt (bad) (e.g.: File.txt)

如果同一路径中的两个文件匹配,我需要删除:*.txt (e.g.: File.txt)并将:重命名x*.txt (e.g.: xFile.txt)*.txt (e.g.: File.txt)

结果:

 Folder 1
  *.txt (e.g: File.txt... old xFile.txt)

我使用这个命令:

find -name 'x*.txt' | sed -r 'p;s/g([^\/]*.txt)/\1/' | xargs -d '\n' -n2 mv

问题在于该命令在执行命令之前不会验证两个文件是否存在(xFile.txt 和 File.txt 在同一路径中)

我该如何解决?提前致谢

答案1

使用 GNU 工具,您可以执行以下操作:

(export LC_ALL=C
  find . -name '*.txt' -print0 |
  sed -Ez 's|/x([^/]*)$|/\1|' |
  sort -z |
  uniq -zd |
  sed -z 'h;s|.*/|&x|;G' |
  xargs -r0n2 echo mv)

假设不存在名称以多个 . 开头的文件x。例如,它不会做mv ./xx.txt ./x.txt

答案2

首先,我们定义一个函数来为我们完成这项工作:

switcheroo() {
    [[ -f x"$1" ]] && mv -f x"$1" "$1"
}
export -f switcheroo

现在,我们使用find一些黑魔法来迭代我们的弃儿:

find . -name \*.txt -execdir bash -c 'switcheroo "$0"' "{}" \;

我们用来find定位所有具有.txt扩展名的文件(可以对其进行细化以适应您喜欢的任何标准),然后通过 switcheroo 进程运行它们 - 我们用来[[ ... ]]测试替换文件是否存在,如果存在,用于mv实现替换。

相关内容