目录中包含的MV文件到目录/新路径

时间:2017-08-09 07:34:53

标签: bash macos shell file mv

我正在使用macOS Sierra。

我有1000多个目录,里面有很多文件。 Word,Excel和Zipped文档。只有一个子级别。重要提示:文件名和文件夹名称中都有空格。

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

我成功创造了Word&使用此命令的Excel目录:

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

基本上,我只想做

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

它不会起作用。我甚至不明白问题是否与$ dir有关 - 我需要双引号来避免空间问题,但是如果我使用双引号...或星号,则星号不起作用。

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

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

我完全陷入困境。

知道怎么处理这个吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

我是其中一个,我创建了一个文件。我命令将目录中的所有文件移动到子文件夹,我将执行以下操作:

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

你可能想在find中试验--exec,但只是创建一个嵌套循环对我来说是最快的解决方案。

让我为你分解一下。在这里,我尝试查找路径中的所有目录,不包括子文件夹目录和当前目录。我可以使用-maxdepth 0查找,但由于我只有这些dirs,所以没有必要

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

现在,在每个dirs中,我们都会尝试查找所有文件(在您的情况下,zip文件以及现在的文件)。

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

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

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

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

答案 1 :(得分:0)

即使在Mac OS X上也应如此。是的,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内立即查找所有常规文件,并将其移至Label userPic = new label(); ImageView userImage = new ImageView( new Image("test/123/headPortrait.png",50.0,50.0,false,false)); userPic.setGraphic(userImage); 。它甚至可以用于疯狂的目录和文件名。

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