如果我理解正确,则希望flac … | lame …
为每个输入行启动一个实例,并将输入插值到两个命令的参数中。
由于需要xargs
启动管道,因此需要使其启动一个能够创建管道的程序,即外壳程序。
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'
或者,让调用shell逐行读取一行并运行管道。
inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done
请注意,格式%w%f
会产生一个绝对路径,您要在该绝对路径之前/media/1tb
和之后添加.mp3
。如果要删除lame
命令中文件的目录部分,请更改$file
为${file##*/}
。如果要剥离扩展名,请更改$file
为${file%.*}
。如果您想两者都做,则必须分两个步骤进行。如果要在其下重现目录层次结构/media/1tb
,可以使用mkdir -p
。
cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
[ -f "$file" ] || continue; # skip directories and other special files
dir=${file%/*}; file=${file##*/}
mkdir -p "/media/1tb/$dir"
flac -cd "$dir/$file" - | lame -b 320 - "/media/1tb/$dir/${file#.*}.mp3"
done
while read …
是一个解决方案,但然后放下xargs
。您写的内容没有任何意义:您认为xargs
从何处获得输入?而且您应该正确地引用事物,音乐文件名通常包含空格。