在我正在进行的一个项目中,我最初有一个名为 asset 的目录,其中有大量目录,其名称不可预测,每个目录都包含许多文件,每个目录的名称都是相同的(但内容不同)。我原来的文件结构看起来像这样:
assets
|
|-some_dir
| |-blue.txt
| |-apple.txt
| |-red.txt
| |-banana.txt
|
|-some_other_dir
| |-blue.txt
| |-apple.txt
| |-red.txt
| |-banana.txt
...
|-yet_another_dir
| |-blue.txt
| |-apple.txt
| |-red.txt
| |-banana.txt
显然,文件和目录没有这些确切的名称。我想引入一种新的文件结构,使文件保留在相同的目录中,但放置在这些目录中的其他目录中:即。我想:
assets
|
|-some_dir
| |-colors
| | |-blue.txt
| | |-red.txt
| |-fruits
| | |-apple.txt
| | |-banana.txt
|
|-some_other_dir
| |-colors
| | |-blue.txt
| | |-red.txt
| |-fruits
| | |-apple.txt
| | |-banana.txt
...
|-yet_another_dir
| |-colors
| | |-blue.txt
| | |-red.txt
| |-fruits
| | |-apple.txt
| | |-banana.txt
资产中有如此多的目录,手动浏览每个目录并不是一种选择,所以我想在一个目录中完成此操作,或者至少使用很少的 shell 命令(顺便说一下,我使用的是 zsh)。
我可以使用回复在每个目录中创建子目录这个问题但我不知道如何将文件移动到新目录中,请记住每个文件只能移动到它已经所在目录内的目录中。
编辑:因为这还不清楚:我愿意单独移动每个文件(按名称)以正确排序它们(每个目录只有少数文件),但我不会为每个单独的目录重复此操作
答案1
就像是:
autoload -U zmv
mkdir-and-mv() {
mkdir -p -- "$2:h" &&
mv -- "$@"
}
typeset -A c
c=(
blue colors
red colors
apple fruits
banana fruits
)
zmv -n -P mkdir-and-mv "(**/)((${(j:|:)${(@bk)c}}).txt)" '$1$c[$3]/$2'
(-n
如果满意,请删除以进行空运行)