LinuxQuestions.org
Visit Jeremy's Blog.
Go Back   LinuxQuestions.org > Forums > Linux Forums > Linux - Newbie
User Name
Password
Linux - Newbie This 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


Reply
  Search this Thread
Old 02-27-2017, 05:53 PM   #1
jr_bob_dobbs
Member
 
Registered: Mar 2009
Distribution: Slackware, Linux From Scratch, Bedrock
Posts: 422
Blog Entries: 56

Rep: Reputation: 60
deleting *all* in current directory (bash)


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 "."?

Thank you.
 
Old 02-27-2017, 06:03 PM   #2
notKlaatu
Senior Member
 
Registered: Sep 2010
Location: Lawrence, New Zealand
Distribution: Slackware
Posts: 1,075

Rep: Reputation: 725Reputation: 725Reputation: 725Reputation: 725Reputation: 725Reputation: 725Reputation: 725
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.
 
Old 02-27-2017, 06:08 PM   #3
hydrurga
LQ Guru
 
Registered: Nov 2008
Location: Pictland
Distribution: Linux Mint 19.1 MATE
Posts: 8,018
Blog Entries: 5

Rep: Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872Reputation: 2872
If you're using Bash:

shopt -s dotglob

ensures that the * glob will subsequently match both unhidden and hidden files.
 
2 members found this post helpful.
Old 02-27-2017, 06:21 PM   #4
Habitual
LQ Veteran
 
Registered: Jan 2011
Location: Yawnstown, Ohio
Distribution: Mojave
Posts: 9,374
Blog Entries: 37

Rep: Reputation: Disabled
I have similar trouble with this particular situation muh damn self.
I check my shit with
Code:
echo rm ...
b/c one rm is too many only "once".

Just sayin'
 
1 members found this post helpful.
Old 02-27-2017, 06:30 PM   #5
r3sistance
Senior Member
 
Registered: Mar 2004
Location: UK
Distribution: CentOS 6/7
Posts: 1,375

Rep: Reputation: 217Reputation: 217Reputation: 217
don't use rm for this, use find

Code:
# 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
 
Old 02-28-2017, 05:32 AM   #6
Jjanel
Member
 
Registered: Jun 2016
Distribution: any&all, in VBox; Ol'UnixCLI; NO GUI resources
Posts: 999
Blog Entries: 12

Rep: Reputation: 361Reputation: 361Reputation: 361Reputation: 361
* .??*

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 .?*

Last edited by Jjanel; 02-28-2017 at 06:02 AM.
 
Old 02-28-2017, 06:53 AM   #7
jpollard
Senior Member
 
Registered: Dec 2012
Location: Washington DC area
Distribution: Fedora, CentOS, Slackware
Posts: 4,844

Rep: Reputation: 1478Reputation: 1478Reputation: 1478Reputation: 1478Reputation: 1478Reputation: 1478Reputation: 1478Reputation: 1478Reputation: 1478Reputation: 1478
I tend to use:

rm -rf .[a-zA-Z0-9]*

or just

rm -rf .[a-z]*
 
1 members found this post helpful.
Old 02-28-2017, 07:16 AM   #8
pan64
LQ Guru
 
Registered: Mar 2012
Location: Hungary
Distribution: debian/ubuntu/suse ...
Posts: 13,611

Rep: Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364Reputation: 4364
just:
Code:
cd ..
rm -rf <dir>
mkdir <dir>
 
3 members found this post helpful.
Old 03-01-2017, 12:18 AM   #9
Jjanel
Member
 
Registered: Jun 2016
Distribution: any&all, in VBox; Ol'UnixCLI; NO GUI resources
Posts: 999
Blog Entries: 12

Rep: Reputation: 361Reputation: 361Reputation: 361Reputation: 361
Oh, it helps to ReallyRead#1
Quote:
a good simple safe way to have the effect of "rm -rf" in the current directory *plus* the removal of files beginning with "."?
While I realized #7 was more accurate than my #6, this #8 is *pure perfect GENIUS*

(I was about to suggest: cd ..; rm -fir $OLDPWD; mkdir $OLDPWD; cd $OLDPWD
but then realized that 'esoterically theoretical' != 'good simple safe' )

OP, can you please use ThreadTools at top, to mark this thread as "[SOLVED]". Thanks!

Last edited by Jjanel; 03-01-2017 at 12:37 AM.
 
Old 03-01-2017, 01:40 AM   #10
John VV
LQ Muse
 
Registered: Aug 2005
Location: A2 area Mi.
Posts: 17,465

Rep: Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606
use " srm" it may or may not be installed but the source is on sourceforge

https://sourceforge.net/projects/srm/files/

BUT as always use CAUTION
 
Old 03-01-2017, 08:02 AM   #11
Habitual
LQ Veteran
 
Registered: Jan 2011
Location: Yawnstown, Ohio
Distribution: Mojave
Posts: 9,374
Blog Entries: 37

Rep: Reputation: Disabled
Code:
alias rm="rm -i"
 
Old 03-01-2017, 06:38 PM   #12
jr_bob_dobbs
Member
 
Registered: Mar 2009
Distribution: Slackware, Linux From Scratch, Bedrock
Posts: 422

Original Poster
Blog Entries: 56

Rep: Reputation: 60
Wow, not as simple a question as I had thought. Thank you, everyone, for the replies.

Now at some point, when I feel brave, to pick which method to try first.
 
Old 03-01-2017, 06:40 PM   #13
jr_bob_dobbs
Member
 
Registered: Mar 2009
Distribution: Slackware, Linux From Scratch, Bedrock
Posts: 422

Original Poster
Blog Entries: 56

Rep: Reputation: 60
Quote:
Originally Posted by Jjanel View Post
OP, can you please use ThreadTools at top, to mark this thread as "[SOLVED]". Thanks!
Is it solved? I have to figure out each of the replies now and then attempt things etc. before such a determination can be made. Why the rush?
 
Old 03-01-2017, 06:53 PM   #14
rknichols
Senior Member
 
Registered: Aug 2009
Distribution: CentOS
Posts: 4,362

Rep: Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001Reputation: 2001
Quote:
Originally Posted by jr_bob_dobbs View Post
Wow, not as simple a question as I had thought.
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.
 
Old 03-01-2017, 10:40 PM   #15
John VV
LQ Muse
 
Registered: Aug 2005
Location: A2 area Mi.
Posts: 17,465

Rep: Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606Reputation: 2606
that is why i like " srm "
Code:
 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

Code:
:~> srm -sr *
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
[SOLVED] Bash hides current directory Asinine Slackware 2 09-13-2009 04:32 AM
Bash, deleting only files in a directory tree? jon_k Programming 4 05-13-2007 12:36 PM
Bash Expression: Current Directory & All Subdirectories Below gmcauley Programming 2 01-01-2007 03:36 PM
setting bash to look in current directory before searching the path muhkuhmasta Linux - Newbie 4 09-21-2004 03:08 AM
BASH: How to get current workin directory? gmitra Programming 9 09-20-2003 11:30 PM

LinuxQuestions.org > Forums > Linux Forums > Linux - Newbie

All times are GMT -5. The time now is 03:51 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration