我想知道是否有办法重命名使用通配符模式找到的各种文件。例如,假设我想要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/
:-)