Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux GNU并行-将输出重定向到具有特定名称的文件_Linux_Bash_Gnu Parallel - Fatal编程技术网

Linux GNU并行-将输出重定向到具有特定名称的文件

Linux GNU并行-将输出重定向到具有特定名称的文件,linux,bash,gnu-parallel,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命令中执行此操作,而不必事先

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

file1.sc.xz.gpg
在运行GnuPG工具之后出现的文件,我希望存储在另一个名为

file1.sc.xz 
我正在努力

find . -type f | parallel "gpg {} > {}.sc.xz"
但这会产生一个名为file1.sc.xz.gpg.sc.xz的文件。我该怎么做


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

您可以使用bash变量扩展来删除扩展名:

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


或者,使用以下扩展:


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

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

find . -type f | parallel gpg {} '>' {.}
parallel gpg {} '>' {.} ::: *
find . -type f -print0 | parallel -0 gpg {} '>' {.}
parallel -0 gpg {} '>' {.} ::: *
如果文件名可能包含\n:

find . -type f | parallel gpg {} '>' {.}
parallel gpg {} '>' {.} ::: *
find . -type f -print0 | parallel -0 gpg {} '>' {.}
parallel -0 gpg {} '>' {.} ::: *
请注意,不应引用相反的shell变量GNU Parallel的替换字符串。这不会创建文件12“,而是12\”(这是错误的):

这些都将做正确的事情:

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

如果<代码>并行< /代码>是你的问题的一个重要部分,请考虑在标题中提到它。它不是bash的一部分,而且是一个异常复杂的工具(也就是说,使用
xargs-P
在没有GNU parallel的情况下并行工作的答案会受到欢迎吗?)顺便说一句,使用
find
parallel
的答案在所有可能的文件名下都不会安全工作。考虑一个特殊有趣的角落情况下的文字换行的名字……尽管缺少适当的引用,但是当前的实现是错误的,甚至在文件中有简单的空白。无法从中移动文件或从手机本身中删除目录。@MaximeGroushkin,…如果您需要正确处理这些情况的指导,我很乐意提供帮助。现在正在研究一个演示NUL分隔的名称流的答案。使用
-print0
parallel--null
来安全防范恶意文件名您不需要在
${f%.*}
周围加上双引号吗?@MaximeGroushkin,否;标量赋值不会发生字符串拆分和全局扩展。
parallel "touch '{}'" ::: '12"'
parallel touch '{}' ::: '12"'
parallel "touch {}" ::: '12"'
parallel touch {} ::: '12"'