在Linux上递归移动文件

6

find ./dir -type f -iname "*.t[argz]*[bz2]" -print0 | xargs -0 mv --target-directory=dir 似乎无法处理文件名中带有空格的文件。如何改进它?或者有没有替代方案?

感谢以下答案:我的mv不支持--null或-0,我正在使用cygwin:

$ mv --help
用法:mv [选项]... [-T] 源目录 目标目录
  或:mv [选项]... 源目录... 目标目录
  或:mv [选项]... -t 目标目录 源目录...
将源重命名为目标,或将源移动到目标目录。
必需的参数 t。 。
3个回答

11

find命令中使用-print0代替-print,并且使用xargs的-0(或--null)选项-这样NUL将被用作分隔符,而不是换行符和空格。

find ./dir -type f -iname "*.t[argz]*[bz2]" -print0 | xargs --null mv --target-directory=dir

$ find ./ -type f -iname "*.xls" -print0 | xargs mv --null --target-directory=xls xargs:警告:输入中出现了一个 NUL 字符。它不能通过参数列表传递。您是否意味着使用 --null 选项? mv:无法识别选项“--null”。 请尝试 `mv --help' 以获取更多信息。 - user217631
抱歉 - 应该是xargs选项,而不是mv选项!已修复。 - martin clayton

0
你看过find命令的-exec选项吗?
find ./dir -type f -iname "*.t[argz][bz2]" -exec mv {} --target-directory=dir ';' 

-exec选项将执行其后的任何选项作为命令,直到看到用引号括起来的分号。这样,您就不必处理间距问题。


1
这会为每个文件生成一个子进程,而xargs变体将数百个文件批处理到同一条命令行上。对于像单个mv调用这样的小操作,这可能是一个显着的性能差异。但是,正如马丁在上面指出的那样,除非您绝对确定文件名没有空格,否则必须使用-print0和--null。 - Andy Ross

0

GNU find

find ./dir -type f -iname "*.t[argz]*[bz2]" -exec mv "{}" /destination +;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接