Wednesday, April 6, 2011

how to delete all files from current directory including current directory

how can I delete all files and sub directories from current directory including current directory?

From stackoverflow
  • operating system? on the *NIX-based stuff, you're looking for 'rm -rf directory/'

    NOTE: the '-r' flag for 'recursive' can be dangerous!

  • olddir=`pwd` && cd .. && rm -rf "$olddir"
    

    The cd .. is needed, otherwise it will fail since you can't remove the current directory.

    kmkaplan : You *can* remove the current directory.
    dwc : kmkaplan, are you *sure* you can delete the current directory with rm? How many operating systems did you base that knowledge on?
    Johannes Weiß : wont work for a directory called --no-preserve-root for example.
    kmkaplan : dwc: yes I tested Linux, OpenBSD and MacOSX. But I am pretty sure every Unix would do the same and I even think every POSIX system will do it.
    Mikeage : You can in Linux (just confirmed). Interestingly enough, once the directory is deleted, ls -al reports "total 0" instead of something like total X, with . and .. present
    Johannes Weiß : deleting an open file is absolutely no problem on unix. Being in a directory is nothing more than having a file open. kmkaplan is correct!
    dwc : I see: rm: "." and ".." may not be removed Why not be conservative and have it work everywhere? What if this snippet gets put in a #!/bin/sh script? What if...? It's nicer to have something that works in a more portable fashion.
  • rm -fr "`pwd`"
    
    kmkaplan : Yeah, a bug in SO prevented the backquotes from appearing.
    Caffeine : Oh it is working with the backquotes - apologies ...
    Johannes Weiß : wont work for a directory called --no-preserve-root for example, too
    kmkaplan : Johannes: pwd returns an absolute path. It will never start with dashes.
    Johannes Weiß : kmkaplan: sorry, thats correct! Didn't thing about that. I always use -- and most of the time it is necessary, but wiht pwd it's not.
  • Under bash with GNU tools, I would do it like that (should be secure in most cases):

    rm -rf -- "$(pwd -P)" && cd ..
    

    not under bash and without GNU tools, I would use:

    TMP=`pwd -P` && cd "`dirname $TMP`" && rm -rf "./`basename $TMP`" && unset TMP
    

    why this more secure:

    • end the argument list with -- in cases our directory starts with a dash (non-bash: ./ before the filename)
    • pwd -P not just pwd in cases where we are not in a real directory but in a symlink pointing to it.
    • "s around the argument in cases the directory contains spaces

    some random info (bash version):

    • the cd .. at the end can be omitted, but you would be in a non-existant directory otherwise...

    EDIT: As kmkaplan noted, the -- thing is not necessary, as pwd returns the complete path name which always starts with / on UNIX

    kmkaplan : As noted above, directories starting with “--” are not a problem: pwd’s result always starts with a “/”.
    Johannes Weiß : sorry, you are right!
    Ib33X : what if you would like to include first a small dialog aka are you sure you want to delete this directory? and make alias for it all?
    Johannes Weiß : You can use rm -rfi instead of rm -rf and it will ask you "rm: remove directory `/tmp/dir_to_be_deleted'?", do you mean that?
    Ib33X : rm -rfi would ask for every action in this directory, I was thinking something that will ask only once and delete everything.
    Johannes Weiß : read -n1 -p"Do you really want to delete '$(pwd -P)' [yN]?" A && if [ "$(echo $A | tr Y y)" = "y" ]; then rm -rf -- "$(pwd -P)" && cd .. ; fi
  • EDIT: Missed the part in the question about removing the current directory, sorry.

    If DOS / Windows CMD then:

    RD /S /Q [drive:]path
    

    /Q = Quiet mode and won't ask for confirmation - probably not advisable unless it has to be run unattended

    EDIT2:

    I think this would be possible under DOS / Windows CMD, but I can;t quite find a way to pipe the data between commands. Someone else may know the fix for that?

    FOR /F %i IN ('cd') DO SET MyDir=%i | CD .. | RD /S %MyDir%
    
    kmkaplan : This does not address the *current* directory part.
    Kristen : Ah, good point, sorry missed that.

0 comments:

Post a Comment