I Use Ubuntu 18.04, 19.10
using #!/bin/bash script how to remove the directories if they are empty from far end and stop at the directory having any file/files.
say.. I have created multiple directories with the below command
mkdir -p $HOME/.local/my/sub/directories/1/2/3lateron during the time I have created lot of files in all directories starting from the directory "my to 1/2/3".
After some time I have deleted all the files in the directories "my", "directories", "1", "2", "3". Note that directory sub is having some files..
mkdir -p option will see if there are parent directories in the command mkdir -p $HOME/.local/my/sub/directories/1/2/3 and its safe.
Question: like above is there any command to see if the directories are empty and delete from far end and stop at directory sub I mean $HOME/.local/my/sub
3 Answers
The reversal of the mkdir -p command would be rmdir -p. rmdir -p will remove the folder structure up till the folder is not empty. You should be able to use rmdir instead of mkdir on your command:
rmdir -p $HOME/.local/my/sub/directories/1/2/3You can also specify wildcards like if your $HOME/.local/my/sub/ contained like directories1, directories2 and directories3 for example, it could be done as:
rmdir -p $HOME/.local/my/sub/directories*/1/2/3or
rmdir -p $HOME/.local/my/sub/*/1/2/3If any folder as it is removing them contains data or another folder you will receive an error message that the directory is not empty and stops.
rmdir: failed to remove directory '/home/user/.local/my/sub': Directory not emptyHope this helps!
4There are two ways I'd attempt this. The easy method is as follows:
# Command to return only empty directories in the current directory:
find . -type d -empty -printNow on my version of Ubuntu, I can simply perform the following:
# Find empty files, and delete them:
find . -type d -empty -deleteOtherwise, you can create some script with a logic to count files in a directory, and delete them. Here is a starting point for counting files in sub-directories:
#!/bin/bash
for i in */ .*/ ; do echo -n $i": " ; (find "$i" -type f | wc -l) ;
done 3 This is closer to the reverse of mkdir -p:
$ cat deldir
#!/bin/bash
[[ $# = 0 ]] && { echo "usage: ${0##*/} DIRECTORY..." >&2; exit 1; }
rc=0
while [[ $# != 0 ]] ;do dir=${1%/} # in case someone specifies DIRECTORY/ out of habit shift while true ;do rmdir -- "$dir" || { rc=1; break; } [[ $dir = */* ]] || break dir=${dir%/*} done
done
exit $rcExample:
mkdir -p a/b/c x/y/z
deldir a/b/c x/y/z