【问题标题】:How to use 'cat' command with -exec in bash? [duplicate]如何在bash中使用'cat'命令和-exec? [复制]
【发布时间】:2018-10-04 14:30:13
【问题描述】:

我搜索了一些文件,我想用其他文件中的新内容替换旧内容,所以我有

#!/bin/bash
find /home/old -path "*$1" -exec cat /home/new/$1 > {} \;

当我执行时:

> sh find.sh 'blam.php'

问题是脚本正在与 find.sh 在同一目录中创建一个名为 {} 的文件

【问题讨论】:

标签: linux bash sh exec


【解决方案1】:

你得到的问题是 > 是 shell 语法的一部分,对于 find 命令和 exec 命令中的语法应该是文字。

你想要做的事情可以分两步完成

  • 生成脚本
  • 执行脚本

.

find /home/old -path "*$1" -printf 'cat /home/new/'"$1"' > %p\n' > script.sh
sh script.sh

这种方式允许检查命令,或使用管道

find /home/old -path "*$1" -printf 'cat /home/new/'"$1"' > %p\n' | sh

另一种效率较低的方法,因为为每个文件生成一个 shell

find /home/old -path "*$1" -exec sh -c 'cat "/home/new/$1" > {}' _ "$1" \; 

【讨论】:

  • 很好的解决方案,但是我可以像-exec sh -c 'echo $1' 一样在 -sh c 中传递 argumnet $1 吗?
  • 将它作为参数传递给sh 命令比将它嵌入到命令中更安全:find ... -exec sh -c 'echo $1' _ "$1"。这里有两个不同的$1s;单引号中的一个是原始 shell 的值(双引号)。
  • 所以-exec sh -c 'cat /home/new/$1 > {}' _ "$1" \;
  • 从评论更新
  • @DobiCaps,变量继承自调用者进程,env可用于为进程设置变量,通过参数传递的命令:-exec env VAR=123 sh -c 'echo "$VAR"' \;,语法_ "$1"用于设置来自sh -cbash -c 命令行参数的位置参数_ 用于$0
【解决方案2】:

这里的问题是> {} 不是 find 命令的一部分。脚本首先由 shell 解释,> 的含义由 shell 处理,然后将其周围的东西作为参数传递给执行:

$ set -- blam.php
$ set -x
$ find /home/old -path "*$1" -exec cat "/home/new/$1" > {} \;
+ find /home/old -path '*blam.php' -exec cat /home/new/blam.php ';'

如果您想在其他地方复制您的文件,use cp

【讨论】:

    猜你喜欢
    • 2018-05-31
    • 2013-12-07
    • 2018-11-25
    • 1970-01-01
    • 2011-05-07
    • 2013-09-26
    • 2021-07-11
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多