删除以“/”结尾的文本行

Lor*_*din 4 linux cp rsync text-processing

我正在使用 rsync 生成已更改的文件列表,然后使用该列表将文件上传到 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
Run Code Online (Sandbox Code Playgroud)

列表中的内容示例

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
Run Code Online (Sandbox Code Playgroud)

除了使用保险丝驱动程序并直接对 s3 执行 rsync 之外,还有什么更好的方法可以做到这一点?

ste*_*eve 12

有一个更好的方法来做到这一点:使用 aws s3 sync

例子

aws s3 sync somefiles/ s3://durktest/blender
Run Code Online (Sandbox Code Playgroud)

阅读AWS CLI 命令参考了解更多信息


Bob*_*ger 7

要删除以 结尾的行/,只需使用sed

sed '/\/$/d'  
Run Code Online (Sandbox Code Playgroud)

从标准输入复制到标准输出,删除以/. 或使用grep

grep -v '/$'  
Run Code Online (Sandbox Code Playgroud)

可能还有很多其他的方式。


Sté*_*las 5

使用 GNU xargs

grep -v '/$' list.txt |
  xargs -rd '\n' -I@FILE@ aws s3 cp "$lcDir/@FILE@" s3://durktest/blender/@FILE@
Run Code Online (Sandbox Code Playgroud)

(假设$lcDir不包含@FILE@

请注意,您的代码中存在一些问题,即:

  • 你在read没有-r和没有清空的情况下打电话$IFS
  • 你忘了引用$lcDir$F
  • 你用过 echo
  • 在任何情况下,使用这种方法都会遇到包含换行符的文件名的问题。

如果您确实想使用循环,则可以执行以下操作:

(
  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"
)    
Run Code Online (Sandbox Code Playgroud)

您可能还需要考虑duplicity哪个 AFAIK 支持 Amazon s3 作为后端。