所以我有多个子目录,其中许多子目录只有1个文件,并且文件名与子目录名相同。
DIR A
--DIR B
----B.zip
--DIR C
----C2.zip
----C3.zip
--DIR D
----D.zip
所以理想的结果应该是:
- 两者
B.zip
并D.zip
移至DIR A
DIR B
现在DIR D
是空的,需要删除,而DIR C
由于包含超过 1 个文件而被单独保留
是否可以做一些事情或者我需要编写特殊的编程代码?
谢谢
答案1
我们使用GNU find
实用程序,它遍历目录树并沿途收集信息。 -depth 选项将使 find 对树进行深度优先遍历,我们会得到恰好存储一个常规文件的目录名称。然后我们将该文件向上移动 abd tgen 删除刚刚清空的目录。
find . -depth ! -name . -type d -execdir \
sh -c '
isFileKnt_1() {
test "$(cd "$1" && find . -maxdepth 1 -type f | grep -c /)" -eq 1
}
for d do
t=$(mktemp -d)
isFileKnt_1 "$d" || exit 0
mv "$d"/* "$t"/.
rmdir "$d"
mv "$t"/* .
done
' find-sh {} +
tree -F 输出操作之前和之后的结果。
.
├── dirB/
│ └── dirB
├── dirC/
│ ├── file_2
│ └── file_3
└── dirD/
└── dirD
.
├── dirB
├── dirC/
│ ├── file_2
│ └── file_3
└── dirD