Search code examples
linuxbashrm

How to remove certain pattern files except another certain pattern files from a list?


I have many file with name chr1_gene_*.raw. I would like to keep some of them. So I use following command.

find . -maxdepth 1 -type f -name "*.raw" -not -name "chr1_gene_448.raw" -not -name "chr1_gene_1914.raw" -not -name "chr1_gene_2456.raw" -not -name "chr1_gene_1554.raw" -not -name "chr1_gene_2024.raw" -not -name "chr1_gene_35.raw" -not -name "chr1_gene_509.raw" -not -name "chr1_gene_1952.raw" -not -name "chr1_gene_575.raw" -not -name "chr1_gene_2249.raw" -not -name "chr1_gene_272.raw" -not -name "chr1_gene_2158.raw" -exec rm -rf {} \;

Sometimes there are too many files I want to keep. I do not want to type "-not -name " too many times. Is there a way to put a list in "-not -name"?


Solution

  • You may achieve this using a script say notnamescript.sh :

    #!/bin/bash
    while read line
    do
    echo "-not -name " $line
    done<notnamelist
    

    Put all the -not -name names in a file called notnamelist. Remember there should be no trailing empty lines.

     find . -maxdepth 1 -type f -name "*.name" $( ./notnamescript.sh ) -exec rm -rf {} \;