我继承了一个项目的文件夹结构,想稍微简化一下。我的根目录下有很多文件夹(第 1 级),每个文件夹中都有许多文件夹(第 2 级),每个文件夹中都有一些文件。它看起来像这样:
root
|-- dir1
| |-- dir1.1
| | +- file1.txt
| |-- dir1.2
| | +- file2.txt
| +-- dir1.N
| +- fileN.txt
|-- dir2
| |-- dir2.1
| +- file3.txt
|-- dir3
| |-- dir3.1
| +- file4.txt
ETC。
我想删除所有 x.1 文件夹,简化结构,并将这些文件夹中的所有文件向下移动一级:
root
|-- dir1
| +- file1.txt
| +- file2.txt
| +- fileN.txt
|-- dir2
| +- file3.txt
|-- dir3
| +- file4.txt
我该如何通过 bash/zsh 完成这样的事情?
答案1
我不知道这是否会在 zsh 中起作用,但我希望它会在 bash 中起作用(尽管我还没有完全测试过它):
对于 f 在 */*/* 做 mv "$f" "$(目录名 "$(目录名 "$f")")" 完毕 对于 f 在 */* 做 如果 [ –d "$f" ] 然后 删除目录“$f” 菲 完毕
PS 在 Unix 中(与植物学不同,即现实世界),树的根在顶部。因此,此操作将被视为移动文件向上目录结构。
答案2
for d in */*; do
mv "$d"/* "$d"/..
rm -r "$d"
done
如果第二级包含空目录或文件,则此方法不起作用。