gpt4 book ai didi

linux - 管道 `find` 到 'tail`

转载 作者:IT王子 更新时间:2023-10-29 00:41:24 24 4
gpt4 key购买 nike

我想获取查找输出的最后两行并将它们复制到某处。我试过了

find . -iname "*FooBar*" | tail -2 -exec cp "{}" dest \;

但输出是尾部的“无效选项 --2”。

此外,我的文件或目录名称包含空格。

最佳答案

以下内容绝对适用于任何路径。

声明一个函数能够use head and tail on NUL-separated output :

nul_terminated() {
tr '\0\n' '\n\0' | "$@" | tr '\0\n' '\n\0'
}

然后您可以使用它在通过 tail 后从您的搜索中获取以 NUL 分隔的路径列表:

find . -exec printf '%s\0' {} \; | nul_terminated tail -n 2

然后您可以将其通过管道传输到 xargs并添加您的选项:

find . -iname "*FooBar*" -exec printf '%s\0' {} \; | nul_terminated tail -n 2 | xargs -I "{}" -0 cp "{}" "dest"

解释:

  1. find当前目录 ( . ) 及以下名称包含 foobar 的文件(由于 i 中的 -iname 不区分大小写);
  2. 对于每个文件,运行(-exec)命令
  3. 打印每个文件路径 ( {} ) 后跟一个 NUL 字符 ( \0 ) 单独 ( \; );
  4. 交换换行符和 NUL 字符 ( tr '\0\n' '\n\0' );"
  5. 获取最后两行(即路径;tail -n 2"$@");
  6. 再次交换换行符和 NUL 字符以获得 NUL 分隔的文件名列表 ( tr '\0\n' '\n\0' )。

xargs命令有点难以解释。它构建了尽可能多的cp ... "dest"命令以适应操作系统的最大命令长度,替换{}命令中的标记带有实际文件名 ( -I "{}" ... "{}" ),在读取参数 ( -0 ) 时使用 NUL 字符作为分隔符。

关于linux - 管道 `find` 到 'tail`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20936209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com