Como encontrar recursos para executar um script de servidor Ubuntu

3

Se alguém puder me indicar onde eu posso aprender mais sobre esse tipo de trabalho, eu agradeceria. Eu tenho alguns scripts de experiência com php mais do que qualquer coisa e tenho trabalhado em aprender Linux (CLI do servidor Ubuntu via SSH e SFTP para mover arquivos para dentro e fora da minha máquina virtual).

Tentando processar várias imagens em vários diretórios em lote. Eu estou usando o imagemagick, que funciona em um arquivo de cada vez.

Eu gostaria que isso fosse executado começando no diretório principal e, em seguida, fizesse esse trabalho para todos os arquivos jpg que o script pudesse encontrar.

pseudo código -

for all folders in the directory
  open folder
  check if folder "drawings" (if !exists) then {start the loop over} else :
    open drawings folder
    for each file in drawings
      if file is a jpg
        run this program on it (convert image.jpg -crop 713x470+5+3 output.jpg)
    
por Edward S Bernstein 10.11.2016 / 18:40

3 respostas

2

Descobri o que eu tinha que fazer em loop, só precisava pegar um jeito da sintaxe do loop . Espero que isso ajude alguém que precise fazer um loop em um subdiretório baseado em seu nome.

for dir in */
do
    for subdir in $PWD/"$dir"*/
    do
        if [ "$subdir" == $PWD/"$dir""Drawings"*/ ]
        then
            for file in "$subdir"*.jpg
            do
                rm "$file"
            done

            for file in "$subdir"*.pdf
            do
                newName="${file/.pdf/}"
                convert -density 200 "$file" -append -resize 850 -background white -flatten "$newName".jpg
            done

            for file in "$subdir"*.jpg
            do
                newName="${file/.jpg/}"
                if [[ "$file" == *"insulation"* ]]
                then
                    convert "$file" -crop 820x710+15+97 "$newName-cropped.jpg"
                else
                    convert "$file" -crop 820x870+15+79 "$newName-cropped.jpg"
                fi
            done
        fi
    done
done
exit 0
    
por Edward S Bernstein 10.11.2016 / 23:05
1

Isso é o que eu criei

#!/bin/bash
dnames=$(for i in $(ls -d $1*/); do echo ${i}; done)
if [ "$#" -eq "1" ]; then
    for dir in $dnames
    do
            cd $1
            cd $dir
            if [ -d "drawings" ]; then
                    cd drawings
                    jpgfiles=$(ls -p | grep -v / | awk '/.jp[e]?g/{print $0}')
                    if [ -z "$jpgfiles" ]; then
                            echo "Directory drawings exist in $dir but no .jpg images were found"
                    else
                            for jpgs in $jpgfiles
                            do
                                    echo "found $jpgs in ${dir}drawings" #convert $jpgs -crop 713x470+5+3 output.jpg
                            done
                    fi
            else
                    echo "Directory drawings cannot be found in $dir"
            fi
    done
else
    echo "A full path to the directory must be given"
    echo "For instance, /home/user1/Pictures/"
fi

Isso deve ser executado com um parâmetro, no qual o parâmetro é o caminho completo para o diretório. Por exemplo, se eu for procurar a pasta drawings que pode estar localizada em um subdiretório no meu diretório / home / joram /

Seria assim

myprogram /home/joram/

O programa faz um loop em / home / joram / através de todos os diretórios que ele contém. Em seguida, ele visita todos os diretórios em / home / joram / na esperança de encontrar a subpasta drawings . Quando o programa encontra a pasta drawings que contém imagens .jpg, os comandos são acionados. Depois de terminar os comandos, o programa continua o loop, desde que todos os diretórios estejam marcados.

Exemplo de uma saída do programa:

#Directory drawings cannot be found in /home/joram/Desktop/
#Directory drawings cannot be found in /home/joram/Documents/
#Directory drawings exist in /home/joram/Downloads/ but no .jpg images were found
#Directory drawings cannot be found in /home/joram/Music/
#Directory drawings cannot be found in /home/joram/my_scripts/
#found test2.jpeg in /home/joram/Pictures/drawings
#found test.jpg in /home/joram/Pictures/drawings
#Directory drawings cannot be found in /home/joram/Public/

OBSERVAÇÃO: Em sua forma atual, o programa apenas imprime os arquivos .jpg encontrados e fornece outras informações (nenhum outro comando é acionado). Desta forma, pode ser testado antes de fazer uma coisa real. Para fazer com que o programa obtenha o que você deseja, exclua a parte de eco e descomente o comando na linha 16 (se esse for o comando real que você deseja executar).

Melhorias podem ser feitas, espero que isso ajude você de qualquer maneira!

    
por jiipeezz 10.11.2016 / 21:48
0

O algoritmo precisa ser exatamente o mesmo ou você se preocupa com o resultado? Porque eu acho que você poderia criar um código muito mais curto e mais fácil se você usar find para o diretório traversal e search:

find /path/to/search-root -path '*/drawings/*.jpg' -execdir convert -crop 713x470+5+3 {} output.jpg \;

Isso localizará todos os arquivos *.jpg que são (grand-) filhos dos diretórios denominados drawings e executam o comando convert neles. O último produz um arquivo output.jpg no mesmo diretório do arquivo de origem. Se houver vários arquivos de origem no mesmo diretório, a instância output.jpg anterior será sobrescrita.

Se você quer querer nomes de arquivos de saída diferentes, “exclusivos”, para não sobrescrever os resultados anteriores, você precisará transformar o nome do arquivo de saída de alguma forma. Infelizmente find não pode fazer isso, mas podemos delegar essa tarefa a um shell. Existem várias maneiras de conseguir isso, embora eu geralmente prefira um pipe para um loop while read porque é menos irritante do que escapar de caracteres especiais:

find /path/to/search-root -path '*/drawings/*.jpg' -print0 |
while IFS= read -rd '' f; do
  convert -crop 713x470+5+3 "$f" "${f%.*}.output.jpg"
done

(Isso requer um shell com suporte para read -d como Bash. Se você precisar de uma alternativa mais portátil, por favor, diga isso.)

    
por David Foerster 11.11.2016 / 08:58