4

Well to put it simply, I have duplicate files in a folder, with this form:

file.ext
file(1).ext
file(2).ext
file(3).ext
otherfile.ext
otherfile(1).ext
otherfile(2).ext
...

I want to move only file.ext and otherfile.ext to another folder. Is it possible to do it in bash?

I thought that maybe awk would be helpful?

3 Answers 3

4

In bash:

shopt -s extglob # activates extended pattern matching features
mv !(*\(+([0-9])\)).ext /path/to/target/

The regular expression matches all files, that don't end with (n).ext, where n is one or more numbers: +([0-9]).

You can check it with echo:

echo !(*\(+([0-9])\)).ext 

Prints:

file.ext otherfile.ext
2
  • extglob is not regex. Commented Sep 18, 2015 at 21:45
  • @Arthur2e5 It isn't what's usually called “regex”, but it is a regular expression, with a different syntax from the usual regex syntax. Well, except that the ! operator isn't a regular expression feature. Commented Sep 18, 2015 at 22:18
3

It depends. If we can assume that any file whose name contains ( should be ignored, you could just do:

shopt -s extglob ## turns on fancy glob patterns
mv !(*\(*) /path/to/target

If you can have other names that contain ( or if you need to only move those files which are duplicated, you can do:

for f in *\(*; do 
    ## Does this file have an original?
    [[ -e "${f%%(*}.${f##*.}" ]] && 
        ## Move the original
        mv "${f%%(*}.${f##*.}" /path/to/target; 
done
-1

Try something like that:

$ ls  *ext | grep -P '[^)]\.ext' | xargs -iXXxxFILEXXxx mv XXxxFILEXXxx target/

grep will filter out files with brackets in names and xargs will run command mv on results. The ugly XXxxFILEXXxx label is for placing file names as mv argument.

1

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.