How to Delete Files and Folders via SSH
There are times when you'll need to remove multiple instances of a certain file that is strewn about your websites files. Maybe you, accidentally created the same file in every directory within your website and they're too numerous to delete manually. Well, theres a command for that. Multiple actually.
Using RM
The simplest way to delete a file a file using the following command: rm
RM
allows you to specify multiple files to be deleted in a single command. Like so:
$ rm file.html file1.html file3.html
However, you would soon notice that listing all the files/folders that need to be deleted can become quite cumbersome and time consuming. Fortunately, rm
accepts several arguments, which can assist us in our task. For example; if we take the above example, we could type:
$ rm file*.html
This would match all files starting with file and ending in .html and subsequently delete them.
To delete an entire directory:
$ rm -rf foldername/
Or
$ rmdir foldername/
To delete all files/folders in the current directory, without deleting the directory itself, you would need to use:
$ rm -rf *
Note: Please be very careful when using rm command, as it might have devastating effects on your website/server, should you delete a system file or a folder.
Using find and -delete
$ find . -name 'duplicate.html' -type f -delete
The -delete
option means that find
will directly delete the matching files as it traverses the directories.
If you need to target only files, using -type f
flag will mean that find
will only process files and not directories. To target directories, you would want to use -type d
.
Using find and -exec
$ find . -name \*.html -type f -exec rm -f {} \; $ find . -name \*.html -type f -exec rm -f {} +
The -exec
option allows find
to execute an arbitrary command per line. The first variant {} \;
will run the command once per file. Whereas the second will group as many of the commands as possible by replacing {}
with as many parameters (files) as possible.
$ find . -name \*.html -type f -exec rm -f {} \;:
An example of the above would be translated into the following if targeting a directory with multiple html files that needed to be removed.
$ find . -name \*.html -type f -exec rm -f file1.html $ find . -name \*.html -type f -exec rm -f file2.html $ find . -name \*.html -type f -exec rm -f file3.html $ find . -name \*.html -type f -exec rm -f file4.html
$ find . -name \*.html -type f -exec rm -f {} +:
An example of the above would be translated into the following if targeting a directory with multiple html files that needed to be removed.
$ find . -name \*.html -type f -exec rm -f file1.html file2.html file3.html file4.html
Using find and xargs
$ find . -name \*.html -type f -print0 | xargs -0 rm -f
Piping the output to xargs is used form more complex per-file commands than is possible with -exec. The option -print0 tells find to separate matches with null instead of a newline, and -0 tells xargs to expect null-separated input. This option is safer when dealing with filenames that contain whitespace.