【问题标题】:Passing awk results to command after pipe在管道之后将 awk 结果传递给命令
【发布时间】:2019-10-17 19:55:34
【问题描述】:

我试图在管道之后将print $1print $2awk 输出传递给setfattr。扩展属性的值是一个 MD5 哈希值,它是根据来自find 命令输出的输入文件计算得出的。这是我目前所拥有的:

find /path/to/dir -type f \
  -regextype posix-extended \
  -not -iregex '.*\.(jpg|docx|psd|jpeg|png|html|bmp|gif|txt|pdf|mp3|bts|srt)' \
| parallel -j 64 md5sum | awk '{system("setfattr -n user.digest.md5 -v " $1 $2)}'

在最后一个管道分别返回哈希和文件路径之后有awk '{print $1}'$2 就好了,我只是不确定如何将这些值放入setfattrsetfattr 只是在运行该命令时引发一般使用错误。这只是一个语法问题还是我完全错了?

【问题讨论】:

  • 或许可以试试for 循环。喜欢for atr1 in $(find ....) ;do setfatter ....$atr ;done
  • 是的,像for i in find /path/to/dir -type f -regextype posix-extended -not -iregex '.*\.(jpg|docx|psd|jpeg|png|html|bmp|gif|txt|pdf|mp3|bts|srt)' -print0); do setfattr -n user.digest.md5 -v "$(md5sum "${i}")" ${i}; done 这样的东西确实有效,但我不知道如何使它与parallel 一起工作。
  • ( your entire for loop ) | parallel -j 64 md5sum ,可能是这个作品。
  • 我决定使用while循环和md5deep。不是很好,但似乎比单线程运行快一点md5sum:find /path/to/dir -type f -regextype posix-extended -not -iregex '.*\.(jpg|docx|psd|jpeg|png|html|bmp|gif|txt|pdf|mp3|bts|srt)' -print0 | while IFS= read -r -d '' i; do setfattr -n user.digest.md5 -v "$(md5deep -j 8 "${i}" | awk '{print $1}')" "${i}"; done

标签: bash awk find xattr


【解决方案1】:

尝试将并行命令的输出通过管道传输到 while 循环中:

find /path/to/dir -type f \
    -regextype posix-extended \
    -not -iregex '.*\.(jpg|docx|psd|jpeg|png|html|bmp|gif|txt|pdf|mp3|bts|srt)' |
  parallel -j 64 md5sum |
  while read hash file; do
    setfattr -n user.digest.md5 -v ${hash} ${file}
  done

【讨论】:

  • 这有使用parallel命令的好处,并且少了一个子进程。
  • 是的,确实有效。我想我不知道while read arg1 arg2 会像awk '{print $arg1, $arg2}' 一样工作。非常感谢。
  • 当您将 bash 内置命令放入管道时,它们会在子 shell 中执行,并获得与管道中任何其他命令相同的文件描述符处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2018-09-14
  • 2021-05-24
相关资源
最近更新 更多