Mover arquivos exclusivos de uma pasta com arquivos duplicados

4

Bem, para simplificar, eu tenho arquivos duplicados em uma pasta, com este formulário:

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

Eu quero mover apenas file.ext e otherfile.ext para outra pasta. É possível fazer isso em bash ?

Achei que awk seria útil?

    
por Luigi 18.09.2015 / 16:38

3 respostas

4

Em bash:

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

A expressão regular corresponde a todos os arquivos, que não terminam com (n).ext , em que n é um ou mais números: +([0-9]) .

Você pode verificar isso com echo :

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

Impressões:

file.ext otherfile.ext
    
por 18.09.2015 / 16:58
3

Depende. Se pudermos supor que qualquer arquivo cujo nome contenha ( deva ser ignorado, você poderá fazer:

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

Se você pode ter outros nomes que contenham ( ou se você precisar mover apenas os arquivos duplicados, faça o seguinte:

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

Tente algo assim:

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

grep filtrará os arquivos com colchetes em nomes e xargs executará o comando mv nos resultados. O feio XXxxFILEXXxx label é para colocar nomes de arquivos como mv argument.

    
por 18.09.2015 / 16:54