Search code examples
linuxbashshellrm

remove files and prompt directories only


As I was deleting many obsolete file trees on a Linux machine I was wondering if there is an easy way to remove files recursively while prompting only on directories.

I could use rm -ri but there some much files that it would be really annoying to answer for every one of them. What really matter to me is being prompted on folders to have more control on what happens.

I am not a bash expert so I am asking if there is a simple way to do this.

Here is my attempt with a long bash script:

#!/bin/bash

promptRemoveDir()
{
  fileCount=$(ls -1 $1 | wc -l)
  prompt=1
  while [ $prompt == 1 ]
  do
    read -p "remove directory: $1($fileCount files) ? [yl]: " answer
      case $answer in
        [yY])
          rm -r $1
          prompt=0
          ;;
        l)
          echo $(ls -A $1)
          ;;
        *)
          prompt=0
          ;;
      esac
  done
}

removeDir()
{
  if [ "$(ls -A $1)" ]
  then dirs=$(find $1/* -maxdepth 0 -type d)
  fi

  if [[ -z $dirs ]]
  then
    promptRemoveDir $1
  else
    for dir in $dirs
    do
      removeDir $dir
    done
    promptRemoveDir $1
  fi
}

for i in $*
do
  if [ -d $i ]
  then
    removeDir $i
  else
    rm $i
  fi
done

Solution

  • Actually I just came upon the -depth option of the find command that is exactly what I was looking for. I can't believe I just missed that:

    -depth Process each directory's contents before the directory itself. The -delete action also implies -depth.

    So similar to @Jidder's code, I can write this:

    dirs=$(find ./test_script -depth -type d); for i in $dirs; do read -p "Delete files in $i?  " REPLY; if [[ $REPLY == [yY] ]]; then rm -r $i; fi; done;
    

    And for more readability:

    dirs=$(find ./test_script -depth -type d)
    
    for i in $dirs 
    do 
        read -p "Delete files in $i? " REPLY
        if [[ $REPLY == [yY] ]]
        then rm -r $i
        fi
    done;