我正在尝试将当前目录下的所有文件和所有子目录收集到一个目录中。我正在尝试类似以下操作
find -type f -exec mv {} collection/{} \;
上述命令不起作用,因为第二个命令{}
给出了完整路径,我该如何收集所有文件?
答案1
删除,将把它作为目标目录,忽略任何父目录{}
:mv
mv
find -type f -exec mv {} collection/ \;
答案2
除了使用find
(它可以很好地完成工作)之外,您还可以使用 shell 来实现此目的。
假设你想要从 $PWD 到 $DEST 的所有文件。自然的尝试是:
mv $PWD/* $DEST
这是如何工作的?表达式“$PWD/*”扩展为该目录中所有文件的名称。此 shell 功能称为“通配符”。的最后一个参数mv
是目标目录。如果您有很多文件,这将不起作用,因为命令行的长度是有限的。
但该解决方案存在一个问题,即它忽略了点文件 - 或“隐藏”文件,即名称以“。”开头的文件和目录。要解决这个问题,您必须告诉您的 shell 在通配符时包含点文件。为此,请使用
shopt -s dotglob
使用时bash
(bash
除非您更改了默认设置,否则您可能会使用)。在此 shell 中,上述命令也适用于点文件。
另外,在 中zsh
,您可以根据具体情况选择此选项。为此,请输入
setopt extendedglob
在你的.zshrc
。然后你可以使用
mv $PWD/*(D) $DEST
移动所有文件,包括点文件。(“D”具有暂时启用“GLOB_DOTS”选项的效果)。
现在最初的问题是将所有常规文件(不是目录)从所有子目录及其子目录移动到单个目录。这可以通过以下方式实现zsh
:
mv $PWD/**/*(D.)
此处的表达式**/*
使通配符递归下降到子目录中。D
表示“还选择点文件”;.
表示“仅选择常规文件,而不是目录”。