bash - remove all directories (and contents) but not files in pwd

18

2

I'd like to remove all directories from the pwd but leave the files in the pwd alone. If the content of my pwd is:

mydir1
mydir2
myfile1
myfile2

then I'd like to be left with just

myfile1
myfile2

I assume that I need to use rm -r -i

Am I correct?

atomh33ls

Posted 2014-02-07T15:33:26.223

Reputation: 669

Answers

10

No that would give you "missing operand" since you didn't specify anything. Putting a * would prompt also for files.

I'd give a try to:

find -mindepth 1 -maxdepth 1 -type d -exec rm -r {} \;

The mindepth 1 will exclude . from the results, the maxdepth 1 will exclude trying to do under the directories that will anyway get deleted (therefore creating a warning). But in practice you could leave them both out if you agree to have a few "innocent" warnings.

fede.evol

Posted 2014-02-07T15:33:26.223

Reputation: 1 718

20

I found this one somewhere:

rm -r */

Seems the easiest way to go. With your example, you would have to confirm each case, if you have 5 files it's OK, but with bigger file structures an interactive mode is't the way to go... Just as a suggestion, if it's important information, make a backup...

Martin

Posted 2014-02-07T15:33:26.223

Reputation: 341

1That will also follow symbolic links, which very probably isn't desired here. – JdeBP – 2014-02-07T16:43:49.653

8

Use

rm -rf ./*/

That avoids interactive mode an deletes only directories in your local directory.

WeSee

Posted 2014-02-07T15:33:26.223

Reputation: 246

As J­de­B­P pointed out on Martin's very similar answer,  if the current (top-level) directory contains symbolic links to other directories, they will also be deleted (even if they aren't in or subordinate to the current directory).

– Scott – 2018-12-21T07:07:45.850

3

Something like this should work:

find /path -type d -exec rm -rf '{}' \;

-type d looks for only directories

Matthew Williams

Posted 2014-02-07T15:33:26.223

Reputation: 4 149

-1

you can also try in this way to delete only all folders not files from any location in linux.

    #delete only all dir and don't touch files
    #!/bin/bash
    for dir in `ls -l | grep ^d | awk '{print $9}'`
    do
    echo "going to delete $dir " `rm -rf $dir`
    done
    ls

linux.cnf

Posted 2014-02-07T15:33:26.223

Reputation: 1