Remova as linhas de texto que terminam em “/”

4

Estou usando o rsync para gerar uma lista de arquivos que foram alterados e, em seguida, usando essa lista para fazer o upload dos arquivos para s3:

rsync -av somefiles/ someotherfiles/ > list.txt


while read F  ; do
        echo $F
        aws s3 cp $lcDir/$F s3://durktest/blender/$F
done <list.txt

Exemplo do que está na lista

swresample-2.dll
swscale-4.dll
tahoe.log
ucrtbase.dll
vcomp140.dll
vcruntime140.dll
2.78/
2.78/config/
2.78/config/bookmarks.txt
2.78/config/recent-files.txt
2.78/config/userpref.blend
2.78/datafiles/
2.78/datafiles/colormanagement/
2.78/datafiles/colormanagement/config.ocio
2.78/datafiles/colormanagement/filmic/
2.78/datafiles/colormanagement/filmic/filmic_desat65cube.spi3d
2.78/datafiles/colormanagement/filmic/filmic_false_color.spi3d
2.78/datafiles/colormanagement/filmic/filmic_to_0-35_1-30.spi1d
2.78/datafiles/colormanagement/filmic/filmic_to_0-48_1-09.spi1d
2.78/datafiles/colormanagement/filmic/filmic_to_0-60_1-04.spi1d
2.78/datafiles/colormanagement/filmic/filmic_to_0-70_1-03.spi1d
2.78/datafiles/colormanagement/filmic/filmic_to_0-85_1-011.spi1d
2.78/datafiles/colormanagement/filmic/filmic_to_0.99_1-0075.spi1d
2.78/datafiles/colormanagement/filmic/filmic_to_1.20_1-00.spi1d
2.78/datafiles/colormanagement/luts/
2.78/datafiles/colormanagement/luts/aces_to_xyz.spimtx
2.78/datafiles/colormanagement/luts/adx_adx10_to_cdd.spimtx

Existe alguma maneira melhor de fazer isso além de apenas usar um driver de fusível e fazer o rsync diretamente para o s3?

    
por LordOdin 22.07.2017 / 08:32

3 respostas

12

Existe uma maneira melhor de fazer isso: use aws s3 sync

Exemplo

aws s3 sync somefiles/ s3://durktest/blender

leia Referência de comandos da AWS CLI para saber mais

    
por 22.07.2017 / 10:45
7

Para remover as linhas que terminam em / , use apenas sed :

sed '/\/$/d'  

Isso copia da entrada padrão para a saída padrão, excluindo as linhas que terminam em / . Ou use grep :

grep -v '/$'  

Provavelmente muitas outras maneiras.

    
por 22.07.2017 / 09:19
5

Com o GNU xargs :

grep -v '/$' list.txt |
  xargs -rd '\n' -I@FILE@ aws s3 cp "$lcDir/@FILE@" s3://durktest/blender/@FILE@

(assumindo que $lcDir não contém @FILE@ )

Note que você tem alguns problemas em seu código:

  • Você chamou read sem -r e sem esvaziar $IFS
  • você esqueceu de citar $lcDir e $F
  • você usou echo
  • em qualquer caso, você terá problemas com nomes de arquivos contendo caracteres de nova linha com essa abordagem.

Se você quisesse usar um loop, poderia fazer:

(
  ret=0
  while IFS= read -r F <&3; do
    case $F in
      (*/) ;;
      (*)
        printf '%s\n' "$F"
        aws s3 cp "$lcDir/$F" "s3://durktest/blender/$F" || ret=$?;;
    esac
  done 3< list.txt
  exit "$ret"
)    

Você também pode considerar duplicity , que o AFAIK suporta o Amazon s3 como back-end.

    
por 22.07.2017 / 10:27