I have a folder with 8000 subfolders, and want to delete those subfolders that only contain one file
Advertisement
Answer
Considering all of the subfolders
are in the same folder with no “sub-sub” depth, find
command prints subfolders with this one-liner and bash
handles the rest:
Sample folder and files:
JavaScript
x
$ 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
One liner to remove subfolders containing only one file:
JavaScript
$ find . -not -empty -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); if((${#files[@]} == "1")); then rm -r $dir exit; fi; done
List of what is remained after removing
JavaScript
$ find .
.
./subfolder_1
./subfolder_1/file1
./subfolder_1/file2
./subfolder_1/file3
./subfolder_3
./subfolder_3/file5
./subfolder_3/file6
./subfolder_4
Extra
List of subfolders with the number of files included:
JavaScript
$ find . -not -empty -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "${#files[@]} $dirn"; done
6 .
3 ./subfolder_1
1 ./subfolder_2
2 ./subfolder_3
1 ./subfolder_5
List of subfolders containing only one file:
JavaScript
$ find . -not -empty -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); if((${#files[@]} == "1")); then printf "${#files[@]} $dirn" exit; fi; done
1 ./subfolder_2
1 ./subfolder_5