Linux: Bash Delete All Files In Directory Except Few

I

‘m a new Linux system user. I need to cleanup in a download directory i.e. delete all files from ~/Downloads/ folders except the following types:

*.iso – All iso images files.

*.zip – All zip files.

How do I delete all file except some in bash shell on a Linux, OS X or Unix-like systems?

 

Bash shell supports rich file pattern matching such as follows:

  • – Match any files.
  • ? – Matches any single character in filenames.
  • […] – Matches any one of the enclosed characters.
  • Method #1: Say hello to extended pattern matching operators
  • You need to use the extglob shell option using the shopt builtin command to use extended pattern matching operators such as:
  • ?(pattern-list) – Matches zero or one occurrence of the given patterns.
  • *(pattern-list) – Matches zero or more occurrences of the given patterns.
  • +(pattern-list) – Matches one or more occurrences of the given patterns.
  • @(pattern-list) – Matches one of the given patterns.
  • !(pattern-list) – Matches anything except one of the given patterns.
  • A pattern-list is nothing but a list of one or more patterns (filename) separated by a |. First, turn on extglob option:
  • shopt -s extglob
  • Bash remove all files except *.zip and *.iso files
  • The rm command syntax is:
  • ## Delete all file except file1 ##
  • rm  !(file1)
  • ## Delete all file except file1 and file2 ##
  • rm  !(file1|file2)
  • ## Delete all file except all zip files ##
  • rm  !(*.zip)
  • ## Delete all file except all zip and iso files ##
  • rm  !(*.zip|*.iso)
  • ## You set full path too ##
  • rm /Users/vivek/!(*.zip|*.iso|*.mp3)
  • ## Pass options ##
  • rm [options]  !(*.zip|*.iso)
  • rm -v  !(*.zip|*.iso)
  • rm -f  !(*.zip|*.iso)
  • rm -v -i  !(*.php)
  • Finally, turn off extglob option:
  • shopt -u extglob
  • Method #2: Using bash GLOBIGNORE variable to remove all files except specific ones
  • From the bash(1) page:
  • A colon-separated list of patterns defining the set of filenames to be ignored by pathname expansion. If a filename matched by a pathname expansion pattern also matches one of the patterns in GLOBIGNORE, it is removed from the list of matches.
  • To delete all files except zip and iso files, set GLOBIGNORE as follows:
  • ## only works with BASH ##
  • cd ~/Downloads/
  • GLOBIGNORE=*.zip:*.iso
  • rm -v *
  • unset GLOBIGNORE
  • Method #3: Find command to rm all files except zip and iso files
  • If you are using tcsh/csh/sh/ksh or any other shell, try the following find command syntax on a Unix-like system to delete files:
  • find /dir/ -type f -not -name  PATTERN  -delete
  • OR
  • ## deals with weird file names using xargs ##
  • find /dir/ -type f -not -name  PATTERN  -print0 | xargs -0 -I {} rm {}
  • find /dir/ -type f -not -name  PATTERN  -print0 | xargs -0 -I {} rm [options] {}
  • To delete all files except php files in ~/sources/ 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 delete all files except *.zip and *.iso is as follows:
  • find . -type f -not \( -name  *zip  -or -name  *iso  \) -delete
  • For more information see bash(1) and find(1).

 

Leave a Reply

Your email address will not be published. Required fields are marked *