Linux GNU并行-将输出重定向到具有特定名称的文件
在bash中,我运行GnuPG对一些文件进行解密,我希望将输出重定向到具有相同名称但扩展名不同的文件。基本上,如果我的文件名为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命令中执行此操作,而不必事先
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"'