2017-08-09 214 views
0

我正在使用macOS Sierra。目录中包含的Mv文件到目录/新路径

我有1000多个包含大量文件的目录。 Word,Excel和压缩文件。只有一个子级别。重要提示:文件名和文件夹名称中有空格。

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

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

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

基本上,我只想做

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

这是行不通的。我甚至不明白,如果问题是与$迪尔 - 我需要双引号,以避免空间问题,但星号是不会工作,如果我使用双引号......或用星号。

我试图根据网站上发现了类似的问题前面的回答,清理结果的子文件夹(并试图基本上避免我的通配符的问题),以获得更清洁的版本:

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

我我完全卡住了。

任何想法如何处理?

回答

0

即使在Mac OS X上也应该这样做。并且是的,find有时需要anchor目录。

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)的生活可能会容易得多。

+0

非常感谢。像魅力一样工作。顺便说一句,我不幸是老板。我在7年前开始业务时没有注意到这个问题......我不会两次犯同样的错误。祝你有个美好的一天 – dacasine

+0

@dacasine好的,很好,因为你是老板,我可以建议你选择'WordAndExcel'而不是'Word&Excel'吗?没有空格,没有'&'(在CLI中有特殊含义的另一个特殊字符)。我发誓,你会在某天或那天感谢这一决定。 –

+0

你说得对。我会肯定地改变它。我们认为它是用户友好的,但我们忘记了,有时候,CLI是处理大量文件列表的最好的朋友。 – dacasine

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 

您可能希望在找到--exec实验,但只是建立一个嵌套的循环是最快的解决方案给我。

让我为你分解它。在这里,我尝试查找我路径中的所有目录,不包括子文件夹目录和当前目录。我本可以用-maxdepth 0与找到,但因为我只有这些迪尔斯,它不是必要现在

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 

请记住,由于第一循环在最后关闭时,它会做移动操作1个目录的时间,以及在只有目录中的所有文件。嵌套循环可能有点棘手,尤其是当别人以他们自己的方式做时,我知道:(

+0

嗨py9,非常感谢你的回答。对我来说似乎很逻辑。这就是说,我试过这个命令,但是macOS bash发现了一个非法的选项--t。我再次检查,用-t - 替换-type,bash不接受。你有什么想法,为什么? – dacasine

+0

嘿,不幸的是我没有在MacOS上工作,所以我无法测试这个,但是搜索它看起来MacOS版本的find需要包含路径。在这种情况下,'find -type f'不会起作用,相反,你应该包含路径,这将基本上......值得一试。更多信息在这里:https://stackoverflow.com/questions/17548854/difference-between-mac-find-and-linux-find – py9

+0

谢谢。尝试*,但由于空间错误而被阻止。 – dacasine

相关问题