28

The obvious solution produces an exit code of 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

One possible solution will skip the "." and ".." directories but will only delete files whose names are longer than 3 characters:

bash$ rm -f .??*
Yonatan Broza
  • 475
  • 2
  • 6
  • 11
  • Well if you're not too worried about not being able to remove . & .. then who cares? unless you're worried about ugly output in a script then I think the obvious solution is less typing that the others quite frankly. – hookenz Jul 30 '09 at 09:31
  • Thanks for the comment Matt. I often use the command in scripts with per command exit code checking (set -e). In these cases an indicative exit code is necessary. – Yonatan Broza Jul 31 '09 at 10:20
  • And there's always rm -rf .* || true if you just want to get around the set -e behavior for that one statement. – Domingo Ignacio Galdos Jun 04 '12 at 02:35
  • Just so you know, .. and . are not files. They are references to directories. . (just a single dot) is the current directory, and .. (two dots) is a link to the directory one level up. For example, if cd /home/user, . is equal to /home/user and .. is /home/ In other words, you can't delete the . and ..(.?) – phuzion Jul 30 '09 at 11:26
  • There is nothing inherent in . and .. that protects them from deletion with rm -rf. This is just a protection mechanism added in modern variations of rm. – kubanczyk Dec 05 '09 at 21:46
  • `find ./ -mindepth 1 -maxdepth 1 -exec rm -rf {} ;` – Khaled AbuShqear Jun 10 '20 at 21:54

4 Answers4

36
rm -rf .[^.] .??*

Should catch all cases. The .??* will only match 3+ character filenames (as explained in previous answer), the .[^.] will catch any two character entries (other than ..).

Russell Heilling
  • 2,557
  • 19
  • 21
2
find -path './.*' -delete

This matches all files in the current directory which start with a . and deletes these recursively. Hidden files in non-hidden directories are not touched.

In case you really wanted to wipe everything from a directory, find -delete would suffice.

Fritz
  • 126
  • 5
0

best way probably is:

  • find . -iname .* -maxdepth 1 -type f -exec rm {} \;

change rm to ls -l if you just want to see what would be deleted, to verbose the output u may want to add -v option to rm

  • -type f options tells find command to look only for files (omit dirs, links etc)
  • -maxdepth 1 tells find not to go down to subdirectories

ps. don't forget about ending '\;'

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.
SergioAraujo
  • 109
  • 3