Estou copiando declarações if-then, com pequenas variações… e eu não deveria ter que

2

Eu sei que há uma maneira melhor de fazer isso, só não estou procurando no lugar certo para descobrir isso.

Eu tenho um número desse tipo de declarações (digamos 1-100, ou uma lista de diferentes nomes de arquivos). Basicamente, estou verificando todos eles e, em seguida, fazendo o mesmo tipo de comando para eles.


if [ -f ~/file1 ]; then 
    if [ -f ~/Backup/file1 ]; then 
       rm ~/file1;
       # Someday, maybe put a filesize or filedate check as well (investigate eval)
    else
       cp -ip ~/file1 ~/Backup/file1;
       rm ~/file1;
   fi
fi

Deveria haver alguma maneira de fazer isso uma função (executar o loop de uma vez com o arquivo 1, depois fazê-lo novamente com o arquivo 2, etc), e não ter que copiar e colar essas coisas repetidas vezes.

Eu gostaria de ter algo claro para novatos, já que uma vez que eu comece a trabalhar, eu provavelmente não voltarei a vê-lo por 5 anos, e quando voltar a ele, provavelmente terei esqueci tudo que não é bem claro. Isso tem a virtude de ser claro no que está acontecendo: P

Eu li algum código que faz isso, disse: "Hmm, isso é interessante, quando eu preciso fazer mais do que 3-4 se-então, eu deveria usar isso." E então, prontamente, não anotou ..

Alguns desses arquivos são: filename001, filename002, ... filename100.

Eu também tenho o mesmo problema para arquivos especificamente nomeados, nesse caso eu realmente gostaria de fazer uma iteração através de uma lista de nomes de arquivos, e apenas adicionar novos nomes de arquivos à lista (ao invés de copiar e colar). / p>

Eu não estou olhando para introduzir nada através da linha de comando, tudo será apresentado no script (para que eu possa testá-lo e, portanto, não posso estragar e digitar algo que eu não queria digitar). A ideia de um arquivo de dados que lista cada nome de arquivo para uma linha, que o script chama, é interessante para mim - mas não tenho certeza de como fazer isso funcionar. Tem um link?

Because this can be a lot easier - and more efficient.

Eu sei que pode ser, mas também tem que ser claro para as pessoas que não programam (ou seja, eu, em 5 anos - quando eu estou começando de um ponto onde eu realmente não sei programar, e terá esquecido muitas coisas no momento em que chegar (se não for entregue a outra pessoa)). Eu basicamente levo as coisas que eu posso entender e brincar com elas até que eu possa abusar delas para os meus propósitos. Neste momento, meus scripts não precisam ser muito eficientes, já que os computadores são rápidos o suficiente para os tipos de coisas que estou fazendo.

Se o arquivo de backup existe, então eu estou apenas excluindo o arquivo atual (se ele existir - se não, eu quero que o script continue na próxima possibilidade). Se o backup não existe, eu estou copiando o arquivo atual (tomara que se eu executar o overquota ou algo assim (outras coisas podem estar fazendo / sugando cota durante o tempo de cópia) ele só irá salvar com um erro, e não ter apagado nada irrecuperável) e, em seguida, excluindo o arquivo atual.

Eu não me importaria de adicionar algo para testar se o arquivo de backup é útil: timestamp (qual deles é mais novo?), tamanho (qual deles é maior?), hash (copiar arquivo completamente e corretamente? ) - mas isso não é necessário agora.

    
por user3082 11.01.2015 / 11:50

1 resposta

1

Ok, então você está procurando por um loop, eu acho.

cd ~; i=1000; set --
until [ "$((i+=1))" -gt 1100 ]
do    _i=${i#1}
      if    [ -f ./file"$_i" ] && 
            [ -f ./Backup/file"$_i" ]
      then  rm ./file"$_i"
      else  set -- ./file"$_i" "$@"
      fi
done
[ "$#" -gt 0 ]                  &&
cp -ip "$@" ./Backup  &&
rm "$@"

Isso contará até 100 e manipulará arquivos entre file[001-100] . Ele cria uma matriz de arquivos que precisam ser copiados e faz o cp -ip de uma vez, fechando o loop conforme necessário. Você pode fazer o mesmo com rm , de fato, se você optou por usar uma matriz nomeada em vez da matriz de shell.

É zero preenchimento do iterador até 100 (onde a avaliação -gt inicial o corta) , mas, como escrito, o script pode ser facilmente modificado para lidar com números de arquivos para 999.

    
por 11.01.2015 / 12:11

Tags