I'm trying to do something which is probably very simple, I have a directory structure such as:
dir/
subdir1/
subdir2/
file1
file2
subsubdir1/
file3
I would like to run a command in a bash script that will delete all files recursively from dir on down, but leave all directories. Ie:
dir/
subdir1/
subdir2/
subsubdir1
What would be a suitable command for this?
find
lists all files that match certain expression in a given directory, recursively.-type f
matches regular files.-print0
is for printing out names using\0
as delimiter (as any other character, including\n
, might be in a path name).xargs
is for gathering the file names from standard input and putting them as a parameters.-0
is to make surexargs
will understand the\0
delimiter.xargs
is wise enough to callrm
multiple times if the parameter list would get too big. So it is much better than trying to call sth. likerm $((find ...)
. Also it much faster than callingrm
for each file by itself, likefind ... -exec rm \{\}
.With GNU's
find
you can use the-delete
action:With standard
find
you can use-exec rm
:where dir is the top level of where you want to delete files from
Note that this will only delete regular files, not symlinks, not devices, etc. If you want to delete everything except directories, use