Home  >  Article  >  Backend Development  >  3 ways to delete specific files in a directory using bash shell

3 ways to delete specific files in a directory using bash shell

高洛峰
高洛峰Original
2017-01-09 13:24:221863browse

I am a new Linux user. Now I need to clean up the files in a download directory. In fact, I just want to delete all the files in the ~/Download/ folder except the files in the following formats:

1.*.iso - all iso formats document.
2.*.zip - All files in zip format.

How do I delete specific files in a bash shell on a Linux, OS X or Unix-like system?

Bash shell supports rich file pattern matching characters, such as:

1.* - matches all files.
2.? - Matches a single letter in a file name.
3.[...] - Matches any letter in the enclosing bracket.

Strategy #1: Meet the extended pattern matching characters

Here you need to use the system’s built-in shopt command to enable the extglob option in the shell, and then you can use the extended pattern matching characters , these pattern matching characters are as follows:

1.? (pattern list) - Matches the given pattern zero or once.
2.*(Pattern List) – Matches the given pattern zero or more times.
3.+(pattern list) - Match the given pattern at least once.
4.@(pattern list) - Match the given pattern once.
5.!(pattern list) - does not match the given pattern.

A pattern list is one or more patterns (file names) separated by |.

First turn on the extgolb option:

shopt -s extglob

Delete all files except .zip and .iso files in Bash
The syntax format of the rm command is:

## 仅保留 file1 文件 ##
rm  !(file1)
 
## 仅保留 file1 和 file2 文件## 
rm  !(file1|file2)
 
## 仅保留 zip 文件 ##
rm  !(*.zip)
 
## 仅保留 zip 和 iso 文件 ##
rm  !(*.zip|*.iso)
 
## 你也可以使用完整的目录 ##
rm /Users/vivek/!(*.zip|*.iso|*.mp3)
 
## 也可以传递参数 ##
rm [选项]  !(*.zip|*.iso)
rm -v  !(*.zip|*.iso)
rm -f  !(*.zip|*.iso)
rm -v -i  !(*.php)

Strategy #2: Use bash's GLOBIGNORE variable to delete all files except the specified file

Excerpted from the bash(1) man page:

This is a colon-separated list of patterns, by path The expansion mode defines the set of files to be ignored. If a file matching a path expansion pattern also matches a pattern in GLOBIGNORE, it is removed from the match list.

To delete all files and keep only zip and iso files, set GLOBIGNORE as follows:

## 只在 BASH 中可行 ##
cd ~/Downloads/
GLOBIGNORE=*.zip:*.iso
rm -v *
unset GLOBIGNORE

Strategy #3: Use the find command to delete all other files and keep only zip and iso files

If you are using tcsh/csh/sh/ksh or other shells, you can try to delete files using the following find command syntax on Unix-like systems:

find /dir/ -type f -not -name '匹配模式' -delete

or

## 对于怪异的文件名可以使用 xargs ##
find /dir/ -type f -not -name '匹配模式' -print0 | xargs -0 -I {} rm {}
find /dir/ -type f -not -name '匹配模式' -print0 | xargs -0 -I {} rm [选项] {}

If you want to delete files other than php in the ~/source directory, type:

find ~/sources/ -type f -not -name '*.php' -delete

or

find ~/sources/ -type f -not -name '*.php' -print0 | xargs -0 -I {} rm -v {}

The syntax to keep only *.zip and *.iso files is as follows:

find . -type f -not \( -name '*zip' -or -name '*iso' \) -delete


For more shell articles related to deleting specific files, please pay attention to the PHP Chinese website!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn