首页 > 解决方案 > 如何删除父文件夹下只有一个文件的子文件夹

问题描述

我有一个包含 8000 个子文件夹的文件夹,并且想删除那些只包含一个文件的子文件夹

标签: linuxunix

解决方案


考虑到所有subfolders文件都在同一个文件夹中,没有“子子”深度,find命令用这个单行打印子文件夹并bash处理其余部分:

示例文件夹和文件:

$ find . 
.
./subfolder_1
./subfolder_1/file1
./subfolder_1/file2
./subfolder_1/file3
./subfolder_2
./subfolder_2/file4
./subfolder_3
./subfolder_3/file5
./subfolder_3/file6
./subfolder_4
./subfolder_5
./subfolder_5/file7
    

删除仅包含一个文件的子文件夹的衬线:

$ find . -not -empty -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); if((${#files[@]} == "1")); then rm -r $dir exit; fi; done

删除后剩余的列表

$ find . 
.
./subfolder_1
./subfolder_1/file1
./subfolder_1/file2
./subfolder_1/file3
./subfolder_3
./subfolder_3/file5
./subfolder_3/file6
./subfolder_4

额外的

包含文件数量的子文件夹列表:

$ find . -not -empty -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "${#files[@]}  $dir\n"; done
    6  .
    3  ./subfolder_1
    1  ./subfolder_2
    2  ./subfolder_3
    1  ./subfolder_5

仅包含一个文件的子文件夹列表:

$ find . -not -empty -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); if((${#files[@]} == "1")); then printf "${#files[@]}  $dir\n" exit; fi; done
1  ./subfolder_2
1  ./subfolder_5

推荐阅读