我在网络驱动器的目录结构中有一堆具有相同扩展名的大文件(每个 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/{}" \;