将名称中包含单引号和双引号的前 1000 个 PDF 文件复制到另一个文件夹

将名称中包含单引号和双引号的前 1000 个 PDF 文件复制到另一个文件夹

我有一个包含 PDF 的文件夹,我需要一次处理 1000 个。所以我需要将它们移到另一个文件夹中,处理它们并删除它们。为此,我尝试使用

$ find . -maxdepth 1 -type f |head -1000|xargs cp -t $destdir

文件名中的单引号和双引号会出错。有数千个文件,我不知道其中有多少个包含这些引号。

有人能帮我找到解决办法吗?

我尝试了这个-0选项,但是没有用

答案1

使用该-print0选项,然后使用此方法申请head于此:

find . -maxdepth 1 -type f -print0 | tr '\0\n' \n\0' | 
    head -1000 | tr '\0\n' \n\0' | xargs --null cp -t $destdir

请注意,xargs有一个-L选项,指定一次应从输入中读取多少个参数。因此,根据您要执行的处理,您可以跳过head,编写一个接受 1000 个参数的脚本,甚至xargs直接通过进行处理。

答案2

这应该可以解决所述问题:

shopt -s globstar
printf '%q\0' **/*.pdf | xargs -0 -L 1000 cp -t $destdir

第一行启用 bash 的 globstar 选项,这样就**可以进行递归搜索。由于printf是 Ubuntu 上的内置 bash,因此应该没有问题包含大量文件。

给出的第一个参数printf告诉它如何格式化所有其他参数。%q告诉它转义所有可能导致问题的\-- 因此foo bar'baz将变为foo\ bar\'baz\0告诉它在每个带引号的字符串后插入一个空字符(相当于在 find 中使用),然后可以通过的选项-print0将其分开。如果您需要使用换行符分隔的名称(我认为您需要这样做,因为您需要和的组合来处理文件批处理),那么您应该使用而不是:xargs-0headtail\n\0

printf '%q\n' **/*.pdf | head -1000 | xargs cp -t $destdir

综上所述,你可能会更好直接从调用你的脚本find——那么您不必担心转义或引用任何内容:

find . -type f -exec your_script '{}' \+

相关内容