在bash中我正在运行GnuPG来解密一些文件,我希望将输出重定向到具有相同名称但扩展名不同的文件。基本上,如果我的文件名为
file1.sc.xz.gpg
运行GnuPG工具后出来的文件我希望存储在另一个名为
的文件中file1.sc.xz
我正在尝试
find . -type f | parallel "gpg {} > {}.sc.xz"
但这会产生一个名为file1.sc.xz.gpg.sc.xz的文件。我怎么能这样做?
稍后编辑:我想在一个单独的bash命令中执行此操作,而不事先知道文件名。
答案 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
值来轻松修改它。