[SOLVED] deleting *all* in current directory (bash)
Linux - NewbieThis Linux forum is for members that are new to Linux.
Just starting out and have a question?
If it is not in the man pages or the how-to's this is the place!
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
While I am not really a newb any more, this question seems newbie-ish to me so here it goes...
In a directory, if one types, "rm -rf *", everything is removed ... except for directories and files beginning with ".".
If one types "rm -rf ." again, one gets an error message and as before, directories and files beginning with "." are not deleted.
Short of a kludge involving sub-shells and the use of find, is there a good simple safe way to have the effect of "rm -rf" in the current directory *plus* the removal of files beginning with "."?
First of all, I don't recommend the direct use of `rm`. I think it's a dangerous tool that should be avoided in favour of a good command line trash application, like trashy or trash-cli.
That said, you're looking for some expansion. Using `ls` instead of `rm` for copy-pasta safety:
Code:
ls {.,}*
That's a brace, dot, comma, brace, asterisk. It means anything with a dot, or anything with nothing.
# mkdir -p test/test
# echo "test" > test/.test.txt
# echo "test" > test/test.txt
# echo "test" > test/test/test.txt
# cd test
# find . -type f
./test/test.txt
./.test.txt
./test.txt
# find . -maxdepth 1 -type f
./.test.txt
./test.txt
# find . -maxdepth 1 -type f -delete
# find . -type f
./test/test.txt
# find . -type f -delete
# find . -type f
Find has more predictable behavior here, so I would say it is my preferred option. maxdepth can be used if you don't want to delete anything in any subdirectories. Else it'll catch all files in all subdirectories too.
Last edited by r3sistance; 02-27-2017 at 06:37 PM.
Reason: including maxdepth
Yes, be careful with this (I just accidentally deleted my .bashrc in experimenting with this)!
For quick simplicity, I add/use: .??*
Tho/but that will not get -single_letter- 'hidden' files, like .a
To check if there's any such [1letter dot-files], I then do: ls -d .?
Take a few minutes to look into the -d and how `echo` acts 'like' a `ls -d`
An important point here is to NOT 'hit' [match in `rm`] . and ..
(the current dir and it's 'parent')
Getting a bit more 'theoretical' here, note how .?* works
(-different- than in grep/regex!)
? matches any one character; * any zero or more; . a dot itself
echo .?*
No, not simple at all unless you make use of the shell's "dotglob" option. Without that, to get everything:
Code:
rm -r .[^.]* ..?* *
The first matches every name that begins with a dot followed by any character except a dot. The second matches any name that begins with ".." followed by at least one more character. The final "*" matches all the non-dot files. It's messy enough to make you at least consider something else.
srm -h
Usage: srm [OPTION]... [FILE]...
Overwrite and remove (unlink) the files. By default use the 35-pass Gutmann
method to overwrite files.
-d, --directory ignored (for compatability with rm(1))
-f, --force ignore nonexistant files, never prompt
-i, --interactive prompt before any removal
-x, --one-file-system do not cross file system boundaries
-s, --simple overwrite with single pass using 0x00 (default)
-P, --openbsd overwrite with three passes like OpenBSD rm
-D, --dod overwrite with 7 US DoD compliant passes
-E, --doe overwrite with 3 US DoE compliant passes
-G, --gutmann overwrite with 35-pass Gutmann method
-C, --rcmp overwrite with Royal Canadian Mounted Police passes
-r, -R, --recursive remove the contents of directories
-v, --verbose explain what is being done
-h, --help display this help and exit
-V, --version display version information and exit
---------
this removes everything in that forled including folders and uses a 1 overwrite of ZEROS
example
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.