我有一个包含 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
-0
head
tail
\n
\0
printf '%q\n' **/*.pdf | head -1000 | xargs cp -t $destdir
综上所述,你可能会更好直接从调用你的脚本find
——那么您不必担心转义或引用任何内容:
find . -type f -exec your_script '{}' \+