在文件中查找模式并重命名

mah*_*ood 56 linux bash

我使用此命令查找具有给定模式的文件,然后将其重命名为其他内容

find . -name '*-GHBAG-*' -exec bash -c 'echo mv $0 ${0/GHBAG/stream-agg}' {} \;
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,我看到一些像这样的输出

mv ./report-GHBAG-1B ./report-stream-agg-1B
mv ./reoprt-GHBAG-0.5B ./report-stream-agg-0.5B
Run Code Online (Sandbox Code Playgroud)

但是最后,当我跑步时ls,我看到了旧的文件名.

kam*_*uel 81

你正在回应你的'mv'命令,而不是实际执行它.改成:

find . -name '*-GHBAG-*' -exec bash -c 'mv $0 ${0/GHBAG/stream-agg}' {} \;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的解决方案.但是,如果你在文件名上有`<whitespace>`,那么更好地将这些变量包围起来.`mv"$ 0""$ {0/GHBAG/stream-agg}"`. (12认同)
  • 我不知道你可以像这样对bash中的变量进行替换.太棒了! (3认同)

anu*_*umi 35

我建议使用该rename命令来执行此任务.rename根据指定为Perl正则表达式的规则重命名提供的文件名.

在这种情况下,您可以使用:

rename 's/GHBAG/stream-agg/' *-GHBAG-*
Run Code Online (Sandbox Code Playgroud)

  • @F-3000:命令是“find”。-name '*-GHBAG-*' -exec rename 's/GHBAG/stream-agg/' {} +` 即使文件名包含空格或换行符,它也会出色地完成这项工作。 (2认同)

Zac*_*Zac 17

在回复anumi的评论时,您实际上可以通过匹配'**'来递归搜索目录:

rename 's/GHBAG/stream-agg/' **/*-GHBAG-*
Run Code Online (Sandbox Code Playgroud)