帮助使用xargs将多个文件名传递给shell脚本
有人能告诉我如何正确使用xargs吗?如果不是xargs,我应该使用什么unix命令 我基本上想输入超过(1)个文件名作为输入帮助使用xargs将多个文件名传递给shell脚本,shell,unix,Shell,Unix,有人能告诉我如何正确使用xargs吗?如果不是xargs,我应该使用什么unix命令 我基本上想输入超过(1)个文件名作为输入,第三个输入参数 例如: 1. use `find` to get list of files 2. use each filename as input to shell script shell脚本的用法: test.sh <localdir> <localfile> <projectname> 编辑: 在大家输入了一些内容并尝
,第三个输入参数
例如:
1. use `find` to get list of files
2. use each filename as input to shell script
shell脚本的用法:
test.sh <localdir> <localfile> <projectname>
编辑:
在大家输入了一些内容并尝试执行-exec
之后,我发现我的
文件名输入和查找也提供了完整路径/path/filename.dat
而不是filename.dat
。有没有办法从find
获取basename?我想这将是一个单独的问题。我只想在这里使用:
这将为/share1/test
下的每个.dat
文件调用一次带有三个参数的/test.sh
将打包所有这些文件名并将它们传递到一次调用/test.sh
,这看起来不像您想要的行为。xargs将尽可能多的文件填充到命令行的末尾。
您想一次在一个文件上执行脚本还是在所有文件上执行脚本?对于一次一个,请使用文件的exec,看起来您已经在使用该文件的语法,但xargs没有使用:
find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
如果要为每个文件执行shell脚本(而不是在整个文件列表中只执行一次),则可能需要使用find-exec
:
find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
记住:
find-exec
用于在一个文件上为每个文件运行命令
xargs
只运行一次命令,使用所有文件作为参数
xargs
不必组合参数,它只是默认行为。这将正确地使用xargs
,按预期执行命令
find /share1/test -name '*.dat' -print0 | xargs -0 -I'{}' ./test.sh /staging/data/project/ '{}' projectZ
将find
配管到xargs
时,通常首选空端接,我建议将-print0
选项附加到find
。在此之后,必须将-0
添加到xargs
,因此它将使用以NULL结尾的参数。这确保了文件名的正确处理。它不适合POSIX,但被认为得到了很好的支持。如果您的命令不受支持,则始终可以删除NULL终止选项
请记住,find
的目的是查找文件,xargs
更通用。我经常使用xargs
来处理非文件名参数。。我运行它仍然有问题。我认为正在发生的是find现在给了我文件名和路径/path/filename.dat
,我只需要basename。@jdame:如果/test.sh
需要basename,那么应该将其更改为call。您可以执行-exec./test.sh/staging/data/project/$(basename{})projectZ\代码>否则(未测试)。这基本上回答了我的问题。非常感谢。我想我必须发布另一个问题,关于从find.execute一次只提取输出的basename。谢谢你的回复。我在开始测试exec
时编辑了我的问题。感谢您澄清了每个cmd之间的用法。@jdame:这不是xargs
的强制行为,我正在用正确的xargs
选项编写正确的答案。
find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
find /share1/test -name '*.dat' -print0 | xargs -0 -I'{}' ./test.sh /staging/data/project/ '{}' projectZ