Mik*_*e B 14 linux shell bash find rename
CentOS 5.x
如果这是一个重复的问题,我深表歉意。我见过很多类似的问题(关于删除文件),但并不完全相同。
我有一个包含数十万个文件(可能超过一百万个)的目录,作为对不同问题的短期修复,我需要将这些文件移动到另一个位置。
出于讨论的目的,假设这些文件最初驻留在其中/home/foo/bulk/,我想将它们移动到/home/foo2/bulk2/
如果我尝试,mv /home/foo/bulk/* /home/foo2/bulk2/ 我会收到“参数过多”错误。
谷歌先生告诉我,批量删除文件的另一种方法是运行查找。就像是: find . -name "*.pdf" -maxdepth 1 -print0 | xargs -0 rm
如果我正在删除内容,那会很好,但在这种情况下,我想移动文件......如果我输入类似find . -name "*" -maxdepth 1 -print0 | xargs -0 mv /home/foo2/bulk2/bash 的内容,则会抱怨该文件不是目录。
在这里将文件从一个目录批量移动到另一个目录的最佳命令是什么?
Gil*_*il' 18
利用 GNUmv的-t选项来指定目标目录,而不是依赖最后一个参数:
find . -name "*" -maxdepth 1 -exec mv -t /home/foo2/bulk2 {} +
Run Code Online (Sandbox Code Playgroud)
如果您在没有该选项的系统上,您可以使用中间 shell 以正确的顺序获取参数(find … -exec … +不支持在文件列表之后放置额外的参数)。
find . -name "*" -maxdepth 1 -exec sh -c 'mv "$@" "$0"' /home/foo2/bulk2 {} +
Run Code Online (Sandbox Code Playgroud)
考虑mv使用父目录而不是文件:
mv /home/foo/bulk /home/foo2/bulk2 && mkdir /home/foo/bulk
Run Code Online (Sandbox Code Playgroud)
(但如果/home/foo/bulk每时每刻都必须存在,它可能会导致问题。)