Shell 未解释xargs参数

Shell 未解释xargs参数,shell,sed,xargs,Shell,Sed,Xargs,我有一个目录$dir,其中包含.txt.xy文件和带有.txt.xy文件的子目录。我尝试迭代每个文件,并将整个路径以及不使用$dir作为参数的路径传递给如下程序: dir="/path/to/" suffix=".xy" find "$dir" -name "*.txt.xy" -print0 | xargs -0 -I {} sh -c 'program "$1" | subprogram

我有一个目录$dir,其中包含.txt.xy文件和带有.txt.xy文件的子目录。我尝试迭代每个文件,并将整个路径以及不使用$dir作为参数的路径传递给如下程序:

dir="/path/to/"
suffix=".xy"

find "$dir" -name "*.txt.xy" -print0 | xargs -0 -I {} sh -c 'program "$1" |
  subprogram filename="$2"' _ {} "$(echo {} | sed -e "s#^${dir}##" -e "s#${suffix}\$##")"
$1应该是完整路径,例如/path/to/subdir/file.txt.xy $2应该是没有$dir和$suffix的完整路径,例如subdir/file.txt
$1是propper完整路径,但$2也是完整路径,就好像$中的管道。。。永远不会被执行。我在这里遗漏了什么?

失败的一个原因是,在双引号下用xargs替换的命令甚至在执行前者之前就被shell扩展了。避免这种情况的一种方法是在sh-c as创建的子shell中进行整个替换

查找$dir-name*.txt.xy-print0| xargs-0-I{}sh-c' f={} g=$echo$f | sed-e's |'^${dir}'| |'-e's |'\\${suffix}$'|' 程序$f |子程序文件名=$g '
失败的一个原因是,在双引号下使用xargs替换的命令甚至在执行前者之前就被shell扩展了。避免这种情况的一种方法是在sh-c as创建的子shell中进行整个替换

查找$dir-name*.txt.xy-print0| xargs-0-I{}sh-c' f={} g=$echo$f | sed-e's |'^${dir}'| |'-e's |'\\${suffix}$'|' 程序$f |子程序文件名=$g '
你的尝试似乎有些迂回。听起来你在找我

find/path/to-name*.txt.xy-exec sh-c' 对于f;做 g=${f*/} 程序$f |子程序文件名=${g%.xy} 完成'{}+ 如果您确实需要将参数放在变量中,那么可以将后缀传递为$0,它在这里不用于任何有用的东西。这有点晦涩,但有助于避免双引号带来的混乱

find/path/to-name*.txt.xy-exec sh-c' 对于f;做 g=${f*/} 程序$f |子程序文件名=${g%$0} 完成'.xy{}+ 以上只是将g删减到基本名称,我猜仔细阅读后,您可能不希望这样做。因此,在$0中传递/path/to,并在$0中硬编码.xy:

find/path/to-name*.txt.xy-exec sh-c' 对于f;做 g=${f$0/} 程序$f |子程序文件名=${g%.xy} 已完成“/path/到{}”+ 或者如果您真的需要两者都是命令行参数

dir=/path/to 后缀=.xy 查找$dir-name*.txt$suffix-exec sh-c' 后缀=$1 转移 对于f;做 g=${f$0/} 程序$f |子程序文件名=${g%$后缀} 已完成“$dir$后缀{}”+
你的尝试似乎有些迂回。听起来你在找我

find/path/to-name*.txt.xy-exec sh-c' 对于f;做 g=${f*/} 程序$f |子程序文件名=${g%.xy} 完成'{}+ 如果您确实需要将参数放在变量中,那么可以将后缀传递为$0,它在这里不用于任何有用的东西。这有点晦涩,但有助于避免双引号带来的混乱

find/path/to-name*.txt.xy-exec sh-c' 对于f;做 g=${f*/} 程序$f |子程序文件名=${g%$0} 完成'.xy{}+ 以上只是将g删减到基本名称,我猜仔细阅读后,您可能不希望这样做。因此,在$0中传递/path/to,并在$0中硬编码.xy:

find/path/to-name*.txt.xy-exec sh-c' 对于f;做 g=${f$0/} 程序$f |子程序文件名=${g%.xy} 已完成“/path/到{}”+ 或者如果您真的需要两者都是命令行参数

dir=/path/to 后缀=.xy 查找$dir-name*.txt$suffix-exec sh-c' 后缀=$1 转移 对于f;做 g=${f$0/} 程序$f |子程序文件名=${g%$后缀} 已完成“$dir$后缀{}”+
这是一种很好的方法,但值得考虑将所有这些逻辑从命令行中提取出来并放入脚本中。这是更容易找到-执行脚本{}\;如果它是可重用的,我绝对会把它放在一个单独的脚本中;如果它只在这个特定的脚本中有用,那么内联它可以避免用随机的谷壳污染你的垃圾箱。请注意find和find之间的区别-执行{}\;与通常更有效的方法相比-exec{}+虽然使用前者可以简化内部脚本。这是一种很好的方法,但值得考虑将所有这些逻辑从命令行中提取出来并放入脚本中。这是更容易找到-执行脚本{}\;如果它是可重用的,我绝对会把它放在一个单独的脚本中;如果它只在这个特定的脚本中有用,那么内联它可以避免用随机的谷壳污染你的垃圾箱。请注意find和find之间的区别-执行{}\;与通常更有效的方法相比-exec{}+虽然使用前者可以简化内部脚本。