如何在 bash -c 中使用 awk 执行 awk ' ' 中的 ' ' 不会破坏 bash -c ' ' bash?

问题描述 投票:0回答:1

一开始我有这个脚本,将标准输出放入 file.txt 中:

find .. -type f -not \( -path '/dev/*' -or -path '/proc/*' -or -path '/sys/devices/*' \) -print0 |
  xargs -0 bash -c 'paste -d ";" <(md5sum "$@") <(sha1sum "$@") <(sha256sum "$@") <(du -lh "$@")' bash 

但是它会返回 5 次带有空格的路径,这使得解析变得困难。

所以我这样做了:

 find / -type f -not \( -path '/dev/*' -or -path '/proc/*' -or -path '/sys/devices/*' \) -print0 |
  xargs -0 bash -c `paste -d ";" <(md5sum "$@" | awk "{print $1}") <(sha1sum "$@" | awk "{print $1}") <(sha256sum "$@" | awk "{print $1;}") <(du -lh "$@"| awk "{print $1;}")` bash

但是不起作用

你会怎么做?

我只是不知道如何获取:md5;sha1;sha256;size;path;md5;sha1;sha256;size;path;md5;sha1;sha256;size;path;md5;sha1;sha256;size;path ;md5;sha1;sha256;大小;路径;md5;sha1;sha256;大小;路径;等等...

基本上,全部在 1 条线上。

bash awk find paste xargs
1个回答
2
投票

在第二个命令中,您对

xargs -0 bash -c `...` bash
使用了反引号“引号”。它们的行为类似于
$(...)
,因此命令字符串在
find | xargs
甚至开始之前就被执行了。
在该命令字符串中,bash 在
$1
甚至开始之前就替换了
awk

对于每一级引用使用一个辅助变量,带有嵌套引号的命令字符串更容易在多个步骤中编写,但由于您使用的是 bash,因此您可以导出一个函数,这使得事情变得微不足道。

您的命令已正确包装

f() {
  paste -d ";" \
    <(md5sum "$@" | awk '{print $1}') \
    <(sha1sum "$@" | awk '{print $1}') \
    <(sha256sum "$@" | awk '{print $1}') \
    <(du -lh "$@" | awk '{print $1}')
}
export -f f
find / -type f -not \( -path '/dev/*' -or -path '/proc/*' -or -path '/sys/devices/*' \) -print0 |
xargs -0 bash -c 'f "$@"' bash

稍微改进并适应您的需求

如您所愿,我们可以在一行中打印所有文件的所有字段 将每个

tr
替换为
\n
。路径不以任何方式引用。如果它们包含
;
或换行符,则解析结果可能会很困难。如果您需要某种形式的引用,请尝试
;
printf %q
sed [-z] 's/.../.../g'

© www.soinside.com 2019 - 2024. All rights reserved.