Macos Bash:在函数中使用xargs/parallel参数进行变量替换
我已经为这个Bash脚本挣扎了大约一周,试图做一件看起来最简单的事情。我使用Macos Bash:在函数中使用xargs/parallel参数进行变量替换,macos,bash,xargs,Macos,Bash,Xargs,我已经为这个Bash脚本挣扎了大约一周,试图做一件看起来最简单的事情。我使用fswatch查看给定文件夹,并生成添加到其中的任何单个文件的文件名作为输出。该输出通过管道传输到xargs,然后运行带有多个命令的函数,这些命令使用fswatch/xargs传递的文件名以及变量/参数替换 #!/bin/bash compressor() { filepath="filepath" mkdir -m 777 /Users/lr/Desktop/Watch/${filepath##/}_
fswatch
查看给定文件夹,并生成添加到其中的任何单个文件的文件名作为输出。该输出通过管道传输到xargs
,然后运行带有多个命令的函数,这些命令使用fswatch
/xargs
传递的文件名以及变量/参数替换
#!/bin/bash
compressor() {
filepath="filepath"
mkdir -m 777 /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
mv ${filepath} /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
/Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath##/} -settingpath /Users/lr/Documents/CONVERTHQTEST.cmprstng -locationpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath%.*}.mp4
}
export -f compressor
/usr/local/Cellar/fswatch/1.8.0/bin/fswatch -0 -v --event Created --event MovedTo /Users/lr/Desktop/Watch |
xargs -0 -n1 -I'filepath' bash -c compressor 'filepath'
在最简单的配置中,我通过管道将输出传输到xargs
,并使用xargs
运行使用参数替换的程序,一切正常。然后我收到一个请求,要求脚本为添加的每个文件创建一个新文件夹,将文件移动到该文件夹,然后运行命令
使用多个命令时,似乎什么都不起作用。我无法让xargs
将参数传递给函数,以便函数可以使用参数定义变量并在文件路径中进行变量替换。如果我在函数中执行xargs-I'filepath'命令“filepath”
,然后执行filepath=“filepath”
,我最终会创建一个名为filepath\u PROCESSING
的文件,而不是在中替换fswatch
中的参数
如何使用
xargs
将参数传递给函数?两件事:您误解了。它们是位置参数(例如1、2、3等),因此您的函数可以定义如下:
compressor() {
filepath="$1"
# define a variable rather than including this 5 times
process="/Users/lr/Desktop/Watch/${filepath#/}_PROCESSING"
mkdir -m 777 "$process"
mv "$filepath" "$process"
/Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath "$process/${filepath#/}" -settingpath /Users/lr/Documents/CONVERTHQTEST.cmprstng -locationpath "$process/${filepath%.*}.mp4"
}
然后,当您调用bash-c
时,它只需要一个参数(参见下面的注释),但您要传递两个参数。尝试一些引用,它应该可以工作:
fswatch -0 -v --event Created --event MovedTo /Users/lr/Desktop/Watch |
xargs -0 -n1 -I filepath bash -c 'compressor "filepath"'
[-c
将]处理选项后,从第一个非选项参数读取并执行命令,然后退出。所有剩余的参数都将指定给位置参数,从$0开始
显然,我无法复制您的设置,但在bash版本3和4中,这对我来说很好:
#!/bin/bash
make_noise() {
echo "$1" "$1" "$1" "$1"
}
export -f make_noise
echo "foo bar" | xargs -I {} bash -c "make_noise '{}'"
尝试:
我也试过这个:
#/bin/bash/usr/local/ceral/fswatch/1.8.0/bin/fswatch-0-v——创建事件——事件移动到/Users/leftright/Desktop/Watch | parallel-0-n1-q-x-v'mkdir-m777/Users/leftright/Desktop/Watch/“{/}”u处理/\;mv“{}”/Users/leftright/Desktop/Watch/“{/}”\u PROCESSING/\/Applications/Compressor.app/Contents/MacOS/Compressor-computergroup“This Computer”-jobpath/Users/leftright/Desktop/Watch/“{/}”\u PROCESSING/“{/}”-settingpath/Users/leftright/Documents/CONVERTHQTEST.cmprstng-locationpath/Users/leftright/Desktop/Watch/“{/}”\u PROCESSING/“{/}”.mp4\”代码>显然这不是很清晰;如果它对问题很重要,应该通过编辑添加,以便其他人可以阅读。感谢您的帮助。现在使用xargs
和bash-c
我得到以下错误:bash:compressor:command not found
。在执行fswatch
和xargs
之前,我添加了export-f
,但似乎没有任何区别。当我将xargs
替换为parallel
时,即使应用了-v
标志,我也没有收到任何反馈。还有其他组件可以让函数作为命令的参数工作吗?对我来说,这很好;请参阅我的编辑以获得一个最小的测试用例。在稍微调整它之后,您的原始示例工作得非常好。我还没试过用parallel。我现在唯一的问题是fswatch递归地监视子目录,因此脚本的原始设计创建了一个子目录循环。我将进行修改,以便将新文件发送到fswatch不监视的另一个文件夹。完成后,我将发布完成的脚本。再次感谢!
#!/bin/bash
compressor() {
filepath="$1"
mkdir -m 777 /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
mv ${filepath} /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING
/Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath##/} -settingpath /Users/lr/Documents/CONVERTHQTEST.cmprstng -locationpath /Users/lr/Desktop/Watch/${filepath##/}_PROCESSING/${filepath%.*}.mp4
}
export -f compressor
/usr/local/Cellar/fswatch/1.8.0/bin/fswatch -0 -v --event Created --event MovedTo /Users/lr/Desktop/Watch |
parallel -0 compressor