How can I remove all .swp files in all of my subdirectories under Linux?
5 Answers
Remove all *.swp files underneath the current directory, use the find
command in one of the following forms:
find . -name \*.swp -type f -delete
The-delete
option means find will directly delete the matching files. This is the best match to OP's actual question.
Using-type f
means find will only process files.find . -name \*.swp -type f -exec rm -f {} \;
find . -name \*.swp -type f -exec rm -f {} +
Option-exec
allows find to execute an arbitrary command per file. The first variant will run the command once per file, and the second will run as few commands as possible by replacing{}
with as many parameters as possible.find . -name \*.swp -type f -print0 | xargs -0 rm -f
Piping the output toxargs
is used form more complex per-file commands than is possible with-exec
. The option-print0
tellsfind
to separate matches with ASCII NULL instead of a newline, and-0
tellsxargs
to expect NULL-separated input. This makes the pipe construct safe for filenames containing whitespace.
See man find
for more details and examples.
-
I'd wrap the name in quotes rather than escape special characters; it feels safer.
'*.swp'
.– CaiMay 15, 2023 at 11:18 -
I used this script anyhow, but my use case is somewhat different. I want to delete all the files from sub-directories, whereas, the file must be in the "migrations" directory.– KhaksarOct 27, 2023 at 7:45
find . -name '*.swp' -delete
Having find do the delete itself remove any risk for space embedded in filename, ...
For extra security also consider adding -type f
for files only.
find /path -type f -name "*.swp" -delete
find /path -type f -name "*.swp" -exec rm -f "{}" +;
bash 4.0
shopt -s globstar
rm -f /path/**/*.swp
For searching under my home directory (and using the GNU 'find' and 'xargs'), I'd use:
find $HOME -name '*.swp' -print0 | xargs -0 rm -f
The use of '-print0
' and '-0
' means that the names will be delimited by ASCII NUL '\0' characters, and this will handle file paths with blanks etc in the names. If you think you might have directories (or device files, or FIFOs, or other non-files) under your directory ending with '.swp', you could add the '-type f
' option to 'find'. If you only have directories, the command above will fail to remove them noisily.
If you would like to delete all the files from all the subfolders, you can use the command provided,
$ find . -name \* -type f -delete