我有两个问题。我试图通过管道传递文件作为参数,并且我试图将该文件用作sh
函数内的变量。
这是我的命令:
find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
在这里,我的行是查找所有看起来像“ segment.something
”的文件并将其传递到管道的右侧。在 中someFunction.sh
,我需要文件名作为参数。假设正在输入的文件segment1
。
将打印出(例如)someFunction.sh
的每一行。segment1
如何将输出从管道的左侧传递到右侧,然后如何在内部调用它someFunction.sh
?
答案1
你的命令
$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh
其效果是,最多someFunction.sh
并行启动 4 个 shell 脚本副本 ( -P 4
)(旧副本完成后将立即生成新副本),每个副本都将一个文件名作为其参数 ( -n 1
)。
这意味着脚本的每次调用都将类似于
sh someFunction.sh segmentsomething
在脚本内部,shell 会将以下值放入位置参数(命令行上的参数) into$1
等$2
($0
通常包含脚本本身的名称)。在您的情况下,$1
将包含文件的名称,其他将为空。
所以,在脚本中:
filename="$1"
echo "$filename"
cat "$filename"
就是这样。现在,通常当人们用来find
查找文件并将其文件名传递给时,xargs
会出现人们倾向于互相提醒的不稳定文件名的问题,我也会在这里这样做。
该find
实用程序传递由空格分隔的文件名。如果您的文件名中含有空格,那就不好了,因为这会导致使用xargs
正确的名称调用脚本时出现问题。
因此,最好的做法是总是使用-print0
withfind
和-0
with xargs
,这意味着文件名不是用空格分隔,而是用nul
字符 ( \0
) 分隔。这使得它更加安全。
因此:
$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh
答案2
someFunction.sh
假设在您的工作目录中,您可以使用类似的东西。
find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh
和允许名称中包含空格的文件(常见问题)-print0
。-0
在我的someFunction.sh
我有
#!/bin/bash
echo "Arg: " $1
cat $1
它只是回显文件名,然后写入传递给的文件内容someFunction.sh