我只是想将一堆文件(不是符号链接)从我的 /etc/apache/sites-enabled 文件夹移到 /etc/apache/sites-available 文件夹中,操作如下:
/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/
但是我是 ubuntu 新手并且遇到了这个错误:
mv: target `./real-file' is not a directory
其中“real-file”是我在开发环境中设置的测试文件。我正在尝试整理生产服务器上其他人的混乱情况 ;-)
答案1
您可以尝试-exec
使用find
命令选项,
/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;
要移动 root 拥有的文件,您需要sudo
权限。
如果您想使用xargs
命令,请-I
向其中添加选项。
find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/
答案2
理想情况下,您应该将 -print0 与 find 结合使用,这样带有空格的文件名就不会搞乱。
例如这应该有效:
find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory
mv -t
可直接使用,xargs
因为源文件位于参数列表的末尾:
mv [OPTION]... -t DIRECTORY SOURCE...
-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
答案3
你也可以用另一种方式来执行相同的操作,但要使用额外表现:
find . -maxdepth 1 -type f -exec mv -t /etc/apache2/sites-available {} \+
请注意,它以结尾,\+
这意味着 find 命令获取输出并扩展为{}
执行您想要的操作,这样您就可以避免两个选项(\;
= 每个条目和管道到新命令xargs
)
这是解释(您也可以查看手册man find
)
-exec 命令 {} + -exec 操作的这个变体在选定的文件上运行指定的命令,但命令行是通过在末尾附加每个选定的文件名来构建的;命令的总调用次数将远少于匹配文件的数量。命令行的构建方式与 xargs 构建其命令行的方式大致相同。 命令中仅允许出现一个“{}”实例。该命令在起始目录中执行。
答案4
对我来说,我的版本mv
没有-t
选项,我的版本xargs
没有-I
选项。我甚至无法使用,-exec
因为find
首先我必须过滤这些结果。所以这就是我使用的:
for f in $(find -type f | grep 'key')
do
mv $f dest/
done