通过管道传递输入文件作为参数?

通过管道传递输入文件作为参数?

我有两个问题。我试图通过管道传递文件作为参数,并且我试图将该文件用作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正确的名称调用脚本时出现问题。

因此,最好的做法是总是使用-print0withfind-0with 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

相关内容