使用 find 批量 mv?

使用 find 批量 mv?

/home/ 目录中散布着一堆 filename.gif。我想用 /home/shared/filename_default.gif 替换所有 filename.gif。

我尝试过类似

find /home/ -name "filename.gif" | xargs <cmd>

但我不知道要引用什么。不确定在这里或 stackoverflow 上提问

编辑:这完全按照我解释的那样工作,除了我不仅希望 filename_default 中的数据替换 filename.gif,还希望将 filename.gif 重命名为 filename_default.gif。所以我照做了,mv {} filename_default.gif将所有文件从其目录复制到 /root/,名称为 filename_default.gif ... 哈哈。有没有办法在目录中引用变化的变量?

例如 find /home/-name“filename.gif” 实际上是位于这样的...

/home/brian/dir/1/2/3/filename.gif
/home/beth/dir/1/2/3/filename.gif
/home/andrea/dir/1/2/3/filename.gif

我怎样才能引用 brian、beth、andrea... 就像通配符 * 一样。

cp /home/shared/filename_default.gif /home/*/dir/1/2/3/filename_default.gif

答案1

这个怎么样?

find /home/ -name filename.gif -exec mv -f /home/shared/filename_default.gif {} \;

-exec 标志让 find 对每个找到的对象执行命令。 表示{}找到的文件的名称。然后您必须使用 终止 shell 命令\;。您也许可以使用ln -s来符号链接这些 .gif。如果您想更改共享的 .gif 而不重新执行这种查找和移动,这可能会更容易。

编辑下面 Denilson 的观点很好。尽管问题涉及mv,但它只会工作一次,然后源文件就会消失。(已移动)他对 echo 命令的建议是一种很好的方法,可以在事情发生之前仔细检查将要发生的事情。

find /home/ -name filename.gif -exec cp -p /home/shared/filename_default.gif {} \;


——克里斯托弗·卡雷尔

答案2

find /home -name filename.gif -type f -printf "%h\0" | xargs -0 --max-args 1 cp -l  /home/shared/filename_default.gif

这不是您要求的通配符,但它确实完成了任务的第一部分,即将“ filename_default.gif”放入目标目录中。如果效果符合您的要求,您可以将cp -l /home/shared/filename_default.gif命令的“ ”部分替换为“ rm”,并将“ -printf "%h\0"”替换为“ -print0”,以删除原始文件。

假设您想要获取内容/home/shared/filename_default.gif并将这些内容放入filename_default.gif包含“ ”的所有目录中名为“ ”的文件中filename.gif,删除“ filename.gif”(从而有效地将filename.gif名为“ ”的文件替换为名为“ ”的文件中相同的图像filename_default.gif

如果要替换“ filename.gif”但保留名称不变,则将“ -printf "%h\0"”替换为“ -print0”并省略该rm步骤。

答案3

# find -type f -name 'filename.gif' -exec cp -v /home/shared/filename_default.gif {} \;

这会用“filename_default.gif”的内容替换所有“filename.gif”文件,但不会将“filename.gif”重命名为“filename_default.gif”

要重命名,请使用以下命令

# rename 's/filename.gif/filename_default.gif/' $(find -type f -name 'filename.gif')

高血压

相关内容