Search code examples
linuxbashrm

How to remove all not single files Linux directory?


I have duplicated files in directory on Linux machine which are listed like that:

ltulikowski@lukasz-pc:~$ ls -1
abcd
abcd.1
abcd.2
abdc
abdc.1
acbd

I want to remove all files witch aren't single so as a result I should have:

ltulikowski@lukasz-pc:~$ ls -1
acbd

Solution

  • The function uses extglob, so before execution, set extglob: shopt -s extglob

    rm_if_dup_exist(){ 
        arr=()
        for file in *.+([0-9]);do
            base=${file%.*};
            if [[ -e $base ]]; then
                arr+=("$base" "$file")
            fi
        done
        rm -f -- "${arr[@]}"
    }
    

    This will also support file names with several digits after the . e.g. abcd.250 is also acceptable.


    Usage example with your input:

    $ touch abcd abcd.1 abcd.2 abdc abdc.1 acbd
    $ rm_if_dup_exist
    $ ls
      acbd
    

    Please notice that if, for example, abcd.1 exist but abcd does not exist, it won't delete abcd.1.