在Linux中,如果文件存在,如何使用单个命令重命名文件

3

如果在Linux中存在文件,我想用一个命令重命名文件。

假设我要查找test.text文件,并将其替换为test.text.bak,则可以执行以下命令:

find / -name test.text 如果它存在,则执行以下命令: mv test.text test.text.bak

在这种情况下,我执行了两个命令,但我希望这可以在一个命令中完成。

谢谢


跳过“查找”部分... - Karoly Horvath
1
你可能想要使用一些版本控制系统,比如git - Basile Starynkevitch
3个回答

3

Just:

mv test.text test.test.bak 

如果文件不存在,则不会重命名任何内容。 为了抑制错误消息,当没有文件存在时,使用以下语法:

mv test.text test.test.bak 2>/dev/null

如果test.text不在当前目录中,这个解决方案是否有效? - Tim Biegeleisen
“工作”是指它会在当前目录中查找除你要查找的文件之外的其他文件吗?当然不会。mv只是检查文件名参数;如果你说mv path/to/file.txt path/to/file.txt.bak,那么它将在当前目录中的path中查找,然后在其中查找to。如果你使用绝对文件名,它将使用该文件名。 - tripleee
@tripleee 没错,你说得对,但问题是这样写的:“然后我执行命令mv test.text test.text.bak”,我认为操作者不会搜索整个目录结构,只会在当前工作目录中搜索文件。 - chaos
2
@chaos 抑制错误消息是一回事;但如果test.text不存在,mv仍然返回非零退出代码,这可能是您想要发生的,也可能不是。 - GhostCat

3

如果您想在dir的子目录中找到test.txt并将其移动,请尝试以下命令:

find dir -name test.txt -exec mv {} {}.bak \;

这将移动所有符合条件的文件。如果您想从当前目录遍历,请使用 . 作为目录,而不是 dir
从技术上讲,这将为 find 匹配的每个文件生成一个单独的命令和进程,但在某种意义上它是“一个命令”,因为您实际上只使用了 find 作为您自己启动的唯一命令。(如果您愿意,可以将 find 视为粗糙的编程语言。)

你可以添加“-maxdepth 1”来仅搜索当前目录,但那有点不太靠谱。 - tripleee

1
for FILE in `find . -name test.test 2>/dev/null`; do mv $FILE $FILE.bak; done

这将搜索当前目录和子目录中名为“test.test”的所有文件,并将每个文件重命名为.bak。

这个程序运行多个命令,按任何有用的定义,对于文件名包含空格或其他shell元字符的文件将失败。最简单、最健壮的修复方法可能是切换到 find -exec mv,但那样会重复我的答案。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接