Como copiar arquivos de imagem cujos nomes não terminam com seu tamanho de resolução?

2

Eu tenho uma pasta com imagens e organizada por pastas de ano e mês (por exemplo, /2015/08/image.jpg ). Sempre que uma imagem é adicionada, ela também é copiada e redimensionada da seguinte forma:

image-1024x768.jpg
image-150x150.jpg
image-300x225.jpg
image-600x450.jpg
image.jpg

Eu gostaria de criar um script que pesquisará cada pasta de ano e mês e copie somente o arquivo original para outra pasta no meu sistema.

Acho que preciso usar expressões regulares, mas não sei como.

EDIT: Aqui estão alguns nomes de arquivos de amostra. Aqueles com uma estrela (*) ao lado deles são os únicos que devem ser copiados.

1450366623-20151217-109x300.png
1450366623-20151217-150x150.png
1450366623-20151217-372x1024.png
1450366623-20151217-600x1650.png
1450366623-20151217.png*
image-3-1024x768.jpeg
image-3-150x150.jpeg
image-3-225x300.jpeg
image-3-300x225.jpeg
image-3-600x450.jpeg
image-3-600x800.jpeg
image-3-768x1024.jpeg
image-3-768x576.jpeg
image-3.jpeg*
IMG_0939-1-1024x768.jpg
IMG_0939-1-150x150.jpg
IMG_0939-1-300x225.jpg
IMG_0939-1-600x450.jpg
IMG_0939-1-768x576.jpg
IMG_0939-1-e1451106610990-150x150.jpg
IMG_0939-1-e1451106610990-225x300.jpg
IMG_0939-1-e1451106610990-600x800.jpg
IMG_0939-1-e1451106610990-768x1024.jpg
IMG_0939-1-e1451106610990.jpg*
IMG_0939-1.jpg*

EDIT 2: Eu disse que as imagens são organizadas em pastas de mês / ano, o que, tenho certeza, significa que deve ser apenas recursivo. No entanto, há outras pastas ao lado de 2015 que eu preferiria não serem copiadas.

Quando estas imagens são copiadas, é possível copiar a estrutura de pastas também?

EDIT 3: Obrigado a todos que responderam à minha pergunta. Eu devo pedir desculpas e lamentavelmente admitir que estou em cima da minha cabeça com este projeto e decidi abandoná-lo. Eu nem sei como implementar a maioria das suas respostas.

    
por kylesureline 18.01.2016 / 17:22

2 respostas

4

Você não precisa de uma expressão regular, precisa de padrões de globalização estendidos. Eu suponho que seu shell é bash:

shopt -s extglob
cd parent-directory-of-2015
for original in */*/!(*-+([0-9])x+([0-9]).jpg); do
    echo "an original: $original"
done

Esse padrão excluirá arquivos com " - dígitos" x dígitos .jpg "

    
por 18.01.2016 / 18:38
0

Parece que o x dentro do tamanho da imagem no nome poderia ser usado, então eu escreveria algo assim. procurando por qualquer arquivo que o nome não tenha o x usando uma substring então copie todos eles, deixando os outros sozinhos.

#!/bin/bash

typeset -i count
let count=0

MAXF="$(find /path -type f -name "*.*" | wc -l)"

find /path   -type f -name "*.*" | while [[ $count -ne $MAXF ]] ;
 do read FILENAME;

name=${FILENAME##*/}
substring="x"

if [[ "$name" != *"$substring"* ]] ; then
     cp -v "$FILENAME" /path/newname
     ((count++))
fi
((count++))
 done

Eu não testei isso ... é improvável, mas isso será configurado para concluir as outras coisas que você já tem em mente para fazer com seu pequeno projeto.

para esta parte da sua pergunta "Quando estas imagens são copiadas, é possível copiar a estrutura de pastas também?" é sim, mas pode se tornar um script complexo, se você estiver apenas lidando com alguns arquivos, e não todos eles em um structor semelhante, mas em um diretório pai diferente.

porque tem que estar em uma partição diferente ou em um nome de diretório pai para ter o mesmo structir subDirectory. aqui está um sniplet de um dos meus scripts que eu faço algo simluar nele.

Isso irá ajudá-lo a descobrir como usar variáveis e linha de comando e a lógica para fazê-lo. o ... indecate código antes disso estaria em vigor para que o resto deste código funcione corretamente. As três primeiras etapas configuram os caminhos dir para usar srtipt_dir. Isso pode não ser realmente necessário em seu script. Tudo depende de como e do que você está fazendo no script para torná-lo um item necessário. move_to pode ser alterado para copy_to.

esta é uma configuração de dois loops que estou usando, trabalhando em um diretório "base" Dir por vez, depois indo para todos os arquivos dentro desse diretório antes de passar para outro diretório "base" dentro de uma árvore e seus subdiretórios. Check-in em uma ramificação diferente do structor de árvore para ver se o mesmo nome de diretório já existe, se não, eu o movo para aquele novo branch fora da árvore, se é então eu copio o conteúdo do branch para aquele outro branch off o structor da árvore, em seguida, apaga tudo o que resta na antiga ramificação da árvore (dir structor).

use muito para checar seu trabalho antes de colocá-lo em ação

#!/bin/bash

script_dir="path"
files_dir="path"
move_to="path/dirName"

........ 

    # if this is say /home/picures/myFotos
    # then this statment will check the last dir name is there
    # if it is not there. It will then create it.

   # you will have to then take off of the old dir structor and 
   # recreate it off of this statement

    if [[ ! -d "$move_to" ]] ; then
            mkdir -v "$move_to"
        fi

      # set for 5th Directory to be Artist Dir
        echo;echo
        OldDirName=${DIRNAME#*/*/*/*/*/}                        
        echo "1 - OldDirName $OldDirName"
        echo
        OldDirName=${OldDirName//\/*}
        echo "2 - OldDirName $OldDirName"
        echo
        echo;echo "OldDirName : $OldDirName"
        echo
    # if no artist on file tag present then keep orginal DirName
        if [ ! -z "$changeDirName" ] ; then

            newDirName="$changeDirName"
        else
            #if no Artist MetaData 
            newDirName="$OldDirName"
        fi

########### CHANGE NAME OF PARENT DIR WHERE IT IS AT FIRST
        echo;echo "Old Dir Name != newDirName " echo "this is MP3Count - "$MP3Count""


        echo;echo "[[ "$OldDirName" != "$newDirName" ]]"


        if [[ "$OldDirName" != "$newDirName" ]] ; then 


            oldDirPathNewName=""$working_dir"/"$newDirName""
            Dir="$newDirName"
            echo;echo "oldDirPathNewName "$oldDirPathNewName""
            echo ""$OldDirName" not = to "$newDirName""

           #change name of dir to artist/band name
            echo "mv "$OldDirName" to "$oldDirPathNewName""

            #change old dir name to new dir name
            #mv -v "$working_dir"/"$OldDirName" "$oldDirPathNewName"

            mv -v "$working_dir"/"$OldDirName" "$oldDirPathNewName"
            echo
        else
            Dir="$OldDirName"
        fi





            from=""$working_dir"/"$Dir""
            to=""$move_to"/"$Dir""          

    #check if the desanation directory is already there if not move it or 
    # copy it into it then remove left overs 

        if [[ ! -d "$to" ]] ; then
        #move_to"/"$Dir" ]] ; then



            echo "inside ck if move to parent / artist to dir is there"
            echo
            echo ""$move_to"/"$Dir" is not there moving "$Dir""
            echo                                    
            #then move the new dir name to a different
            # place for safe keeping
            echo
            echo;echo "just befor move "
            echo
            echo

            echo "$from -> $to"
            mv -vf "$from" "$to"

            echo    
            echo "DirIsaidtoDo Left : $DirIsaidtoDo"
            echo        

        else


            echo ""$move_to"/"$stringNewDir" is there moving within it into"
            echo
            echo "$move_to"/"$stringNewDir"
            echo

            echo
            cp -Rv "${from}"/* "$to"  
            echo
            rm -rv "$from"
            echo
            echo "DirIsaidtoDo Left : $DirIsaidtoDo"
            echo
        fi

    fi                           

            echo "********** NEXT FILE ***********************"     

        done
        let DirCountDn++
        echo "Dir Count Dn "$DirCountDn"" 
        echo "******************************************" 
        let AmountDirs--
        echo "Amount Dirs to go $AmountDirs"
        echo
        let DirIsaidtoDo--

        echo;echo;echo


    done #FOR DIR Names

para criar mais de um diretório em uma ordem de arrumação do caminho, isso cria todos os dirNames configurando um diretório pai e seu sub-diretório também

 mkdir -pv path/dirName/DirName/DirName
    
por 19.01.2016 / 01:28