/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')
高血压