我正在使用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
我完全陷入困境。
知道怎么处理这个吗?
答案 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)的生活可能会容易得多。