bash:向使用通配符找到的文件添加通用字符串

bash:向使用通配符找到的文件添加通用字符串

我想知道是否有办法重命名使用通配符模式找到的各种文件。例如,假设我想要scp所有与特定模式匹配的文件,但在某个位置将字符串附加到文件名中。像这样:

偏僻的:

hello.txt
help.txt
heroes.txt

我想要本地:

hello_copy.txt
help_copy.txt
heroes_copy.txt

显然scp user@remote_host:~/he*.txt ./he*_copy.txt行不通。我想知道这是否可行,或者我是否需要单独复制每个文件。

理想情况下,我正在寻找一种可以在 bash 中运行的解决方案,以便我可以使用 、 等执行相同的mv操作cp

答案1

不幸的是,通配符非常有限。但可以使用几个额外的命令来完成。首先,您可以使用以下命令遍历文件for

bash$ ls -1
hello.txt
help.txt
heroes.txt
bash$ for f in *; do echo "$f"; done
hello.txt
help.txt
heroes.txt

*.txt您还可以使用而不是仅仅进行初始过滤*。 确保引用变量以防止文件名中的空格或特殊字符破坏命令。

现在你可以用另一个字符串替换sed反斜杠是因为有特殊的意义,没有它,美元符号在表示“字符串结尾”之后):

bash$ for f in *; do echo "$f" | sed s/\.txt$/_copy.txt/; done
hello_copy.txt
help_copy.txt
heroes_copy.txt

您可以轻松地将其转换为命令。例如mv(我们先看看它是如何做一个额外的echo):

bash$ for f in *; do echo mv "$f" `echo "$f" | sed s/\.txt$/_copy.txt/`; done
mv hello.txt hello_copy.txt
mv help.txt help_copy.txt
mv heroes.txt heroes_copy.txt

一切看起来都很好,现在让我们开始真正行动吧:

bash$ for f in *; do mv "$f" `echo "$f" | sed s/\.txt$/_copy.txt/`; done
bash$ ls -1
hello_copy.txt
help_copy.txt
heroes_copy.txt

你甚至可以撤消重命名使用sed s/_copy\.txt$/.txt/:-)

相关内容