【发布时间】:2016-06-11 23:26:15
【问题描述】:
我已经为这个 Bash 脚本苦苦挣扎了大约一周,试图做看似最简单的事情。我正在使用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' command 'filepath' 然后filepath="filepath",我最终会以mkdir 创建一个名为filepath_PROCESSING 的文件,而不是替换来自fswatch 的参数。
如何使用xargs 将参数传递给函数?
【问题讨论】:
-
我也试过这个:
#!/bin/bash /usr/local/Cellar/fswatch/1.8.0/bin/fswatch -0 -v --event Created --event MovedTo /Users/leftright/Desktop/Watch | parallel -0 -n1 -q -x -v 'mkdir -m 777 /Users/leftright/Desktop/Watch/"{/.}"_PROCESSING/ \; mv "{}" /Users/leftright/Desktop/Watch/"{/.}"_PROCESSING/ \; /Applications/Compressor.app/Contents/MacOS/Compressor -computergroup "This Computer" -jobpath /Users/leftright/Desktop/Watch/"{/.}"_PROCESSING/"{/}" -settingpath /Users/leftright/Documents/CONVERTHQTEST.cmprstng -locationpath /Users/leftright/Desktop/Watch/"{/.}"_PROCESSING/"{/.}".mp4 \;' -
显然这不是很清晰;如果对问题很重要,则应通过编辑添加它,以便其他人可以阅读。