【问题标题】:Rename file in Linux if file exist in a single command如果文件存在于单个命令中,则在 Linux 中重命名文件
【发布时间】:2015-04-15 09:10:24
【问题描述】:

如果文件存在于单个命令中,我需要在 Linux 中重命名文件。

假设我想搜索 test.text 文件并想用 test.text.bak 替换它,然后我触发以下命令

查找 / -name test.text 如果它存在,那么我会触发命令 mv test.text test.text.bak

在这种情况下,我正在执行两个命令,但我希望这应该在单个命令中发生。

谢谢

【问题讨论】:

  • 跳过find部分...
  • 你可能想使用一些版本控制系统,比如git

标签: linux shell command


【解决方案1】:

只是:

mv test.text test.test.bak 

如果文件不存在,则不会重命名。 要抑制错误消息,当没有文件退出时,请使用该语法:

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

【讨论】:

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

如果您想在dir 的子目录中的某个位置找到test.txt 并移动它,请尝试

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

这将移动所有符合条件的文件。如果要从当前目录遍历,使用.作为目录,而不是dir

从技术上讲,这将为find 匹配的每个文件在单独的进程中生成一个单独的命令,但它是“一个命令”,因为您使用find 作为您实际启动的唯一命令。 (如果您愿意,可以将find 视为一种粗糙的编程语言。)

【讨论】:

  • 您可以添加-maxdepth 1 以仅搜索当前目录,尽管这有点麻烦。
【解决方案3】:
for FILE in `find . -name test.test 2>/dev/null`; do mv $FILE $FILE.bak; done

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

【讨论】:

  • 根据任何有用的定义,这将运行多个命令,并且对于名称包含空格或其他 shell 元字符的文件将失败。最简单、最可靠的解决方法可能是切换到find -exec mv,但这会重复我的答案。
猜你喜欢
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2020-09-17
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多