GNU Parallel - 将输出重定向到具有特定名称

时间:2015-06-10 15:13:21

标签: linux bash gnu-parallel

在bash中我正在运行GnuPG来解密一些文件,我希望将输出重定向到具有相同名称但扩展名不同的文件。基本上,如果我的文件名为

file1.sc.xz.gpg

运行GnuPG工具后出来的文件我希望存储在另一个名为

的文件中
file1.sc.xz 

我正在尝试

find . -type f | parallel "gpg {} > {}.sc.xz"

但这会产生一个名为file1.sc.xz.gpg.sc.xz的文件。我怎么能这样做?

稍后编辑:我想在一个单独的bash命令中执行此操作,而不事先知道文件名。

3 个答案:

答案 0 :(得分:3)

您可以使用bash变量扩展来切断扩展名:

$ f=file1.sc.xz.gpg
$ echo ${f%.*}
file1.sc.xz

E.g:

find . -type f | parallel bash -c 'f="{}"; g="${f%.*}"; gpg "$f" > "$g"'

或者,使用parallel扩展:

find . -type f | parallel 'gpg "{}" > "{.}"'

答案 1 :(得分:1)

如果保证文件名不包含\ n:

find . -type f | parallel gpg {} '>' {.}
parallel gpg {} '>' {.} ::: *

如果文件名可能包含\ n:

find . -type f -print0 | parallel -0 gpg {} '>' {.}
parallel -0 gpg {} '>' {.} ::: *

请注意,不应引用相反的shell变量GNU Parallel的替换字符串。这将创建文件12“,而是12 \”(这是错误的):

parallel "touch '{}'" ::: '12"'

这些都是正确的:

parallel touch '{}' ::: '12"'
parallel "touch {}" ::: '12"'
parallel touch {} ::: '12"'

答案 2 :(得分:0)

find . -type f -print0 | \
  xargs -P 0 -n 1 -0 \
    bash -s -c 'for f; do g=${f%.*}; gpg "$f" >"$g"; done' _

现在,每个shell只处理一个文件,但您可以通过更改-n值来轻松修改它。