directories/new 路径目录中包含的 Mv 文件

Mv files contained in directories to directories/new path

我正在使用 macOS Sierra。

我有大约 1000 多个目录,里面有很多文件。其中包含 Word、Excel 和 Zipped 文档。只有一个子级别。重要提示:文件名和文件夹名中有 spaces。

我们决定更改文件的树状结构;在与另一个目录树合并之前,每个目录中的所有文件都需要移动到名为 "Word & Excel" 的子目录中。

我设法用这个命令创建了 Word & Excel 目录:

for dir in */; do mkdir -- "$dir/Word & Excel"; done

基本上,我只想做

for dir in */; do mv $dir/* "./Word & Excel"; done

这是行不通的。我什至不明白问题是否出在 $dir 上——我需要双引号来避免 space 问题,但如果我使用双引号,星号将不起作用……——或者星号。

我试图通过遵循先前在网络上找到的类似问题的答案来获得更清晰的版本,清除结果的子文件夹(并基本上尝试避免我的通配符问题):

for dir in */; do mv `ls -A "$dir" | grep -v "Word & Excel"` ./"Word & Excel" | cd ../ ; done

我完全卡住了。

知道如何处理吗?

好的,我将使用 "subfolder" 作为我的子文件夹名称。

首先,在所有目录中创建子文件夹

for dir in $(find -type d | grep "/");do mkdir $dir/subfolder; done

我每一个都创建了一个文件。我为了将 dirs 中的所有文件移动到子文件夹,我会做这样的事情:

for dir in $(find -type d | grep -vE 'subfolder' | grep '/');do for file in $(find $dir -type f);do mv $file $dir/subfolder;done  ;done

您可能想在查找中尝试使用 --exec,但对我来说创建嵌套循环是最快的解决方案。

让我为您分解一下。在这里,我试图找到路径中的所有目录,不包括子文件夹目录和当前目录。我本可以将 -maxdepth 0 与 find 一起使用,但由于我只有这些目录,因此没有必要

for dir in $(find -type d | grep -vE 'subfolder' | grep '/')

现在,在每个目录中,我们尝试找到所有文件(在您的情况下,是 zip 文件等等)。

do for file in $(find $dir -type f)

现在,我们只需将找到的文件移动到第一个循环的目录中,并附加子文件夹的名称。

do mv $file $dir/subfolder;done  ;done

请记住,由于第一个循环在最后关闭,它将一次对一个目录执行移动操作,并且只对该目录中的所有文件执行移动操作。嵌套循环可能有点难以理解,尤其是当其他人按照自己的方式进行时,我知道:(

这应该可以,即使在 Mac OS X 上也是如此。是的,find 有时需要锚目录。

while read dir; do
  mkdir -p "$dir/Word & Excel"
  find "$dir" -maxdepth 1 -type f -exec mv {} "$dir/Word & Excel" \;
done < <(find . -mindepth 1 -maxdepth 1 -type d)

这遍历当前目录的子目录(仅一个子级),对于它们中的每一个(dir),如果它创建 dir/Word & Excel 子目录尚不存在,立即在 dir 中找到所有常规文件并将它们移动到 dir/Word & Excel 中。它甚至可以使用疯狂的目录和文件名。

话虽如此,如果您能说服您的老板不要使用不寻常的文件或目录名称,那么您使用 bash 和命令行界面 (CLI) 可能会容易得多。