如何将文件头复制到另一个文件夹,同时保留树结构?

如何将文件头复制到另一个文件夹,同时保留树结构?

我在网络驱动器的目录结构中有一堆具有相同扩展名的大文件(每个 4GB+),但我只对每个文件的前几个字节感兴趣,因此我想将它们全部复制到我的本地驱动器,使用相同的文件名并保持相同的文件夹结构。

我试过了:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{} \;
$ find . -type f -name "*.ext" -exec head -c 128 {} > ~/Desktop/heads/{} \;

但它不起作用,因为它们都被放在一个名为“{}”的文件中,可能是因为“>”运算符没有被解释为 -exec 参数的一部分,如果我用“\>”对其进行转义,那么它会被转义到 head 参数,这也不起作用。

答案1

您正确地观察到问题出在>重定向上。有两种解决方案:

可以使用这样的方法:

find . -type f -name "*.ext" -exec sh -c "head -c 128 '{}' > ~/Desktop/heads/'{}'" \;

或者您也可以将其'{}'作为参数传递给子 shell,如下所示:

find . -type f -name "*.ext" -exec sh -c 'head -c 128 $1 > ~/Desktop/heads/$1' -- {} \;

后者之所以有效,是因为-- {}将文件名作为参数传递给sh -c,可以通过 访问$1。请注意,现在必须使用单引号'而不是双引号。


更新:我实际上发现了一个 Stack Overflow 问题,它涵盖了您的根本问题,即使用>withinxargs或类似命令:

如何在 xargs 命令中使用 >?

我想找到一个 bash 命令,它可以让我 grep 目录中的每个文件,并将该 grep 的输出写入单独的文件。[...]

答案2

您的重定向破坏了它。请将其更改为:

$ find . -type d -exec mkdir -p ~/Desktop/heads/{}
$ find . -type f -name "*.ext" -exec sh -c "head -c 128 {} > ~/Desktop/heads/{}" \;

相关内容