【问题标题】:Shell script to copy(scp) and rename用于复制(scp)和重命名的 Shell 脚本
【发布时间】:2016-09-27 10:40:54
【问题描述】:

我的服务器中有一个文件夹,其中包含一些 PDF 文件。我的问题是,我必须复制到其他服务器并重命名它。

名称格式是这样的“yymmdd_hhmmss_FileNo_PdfNo.pdf”

yymmdd_hhmmss_001_AC1.pdf
yymmdd_hhmmss_001_AC2.pdf
yymmdd_hhmmss_002_AC1.pdf
yymmdd_hhmmss_003_RCY1.pdf

在复制这些文件时,我想重命名每个文件。 名称格式是这样的“FileNo_PdfNo_yymmddhhmmss.pdf”

001_AC1_yymmddhhmmss.pdf
001_AC2_yymmddhhmmss.pdf
002_AC1_yymmddhhmmss.pdf
003_RCY1_yymmddhhmmss.pdf

我想为此编写一个 shell 脚本(bash)。请给我一些想法或一些与此相关的示例脚本。

【问题讨论】:

  • scp source_name user@remote_host:dest_name
  • 或者如果你愿意,你可以scp整个目录然后ssh user@remote_host prename ...命令
  • 添加到目前为止所做的事情总是好的。见[ mcve ]
  • @anishsane 并没有真正解决他的问题,因为他想增加文件名开头的数字,所以他需要先检查现有文件,以获得当前数字..
  • ^^ 从问题中的 sn-p 看起来不是这样;或者至少还不清楚。我将其解释为文件名中的部分(由下划线分隔)需要重新洗牌。

标签: linux bash shell copy rename


【解决方案1】:

使用 GNU 焦油:

tar -cf - *.pdf | ssh user@server "tar -xvf - --transform='s/\(.\{6\}\)_\(.\{6\}\)_\(...\)_\(.\{3,\}\)\.pdf/\3_\4_\1\2.pdf/' --show-transformed-names"

如果要更改目标目录,请使用 tar 选项 -C


见:The Stack Overflow Regular Expressions FAQ

【讨论】:

    【解决方案2】:

    通过一些小的调整,这应该适合你。我将解释/ cmets 放在脚本中。您可以在没有循环的情况下执行此操作,但同时使用 scp 传输和重命名多个文件会很棘手。如果您在本地重命名它们然后转移它们,那么进行单个 scp 调用会很容易。你也可以把它浓缩成一个衬里;但我认为这种方法可能更具说明性且更易于修改。

    #!/bin/bash - 
    
    # associative array to hold new file names
    declare -A new;
    
    # local and remote paths terminated with / for laziness
    local_path="/lcl/path/to/pdfs/"
    remote_path="/remote/path/to/pdfs/"
    
    # user@machine for remote ssh connection
    user_mach="username@machinename"
    
    # error accumulator
    local lcl_err=0
    
    # Collect list of files to send - you may want this to be
    # more discriminating
    orig=`find "$local_path" -name "*.pdf" -exec basename {} \;`
    
    # Iterate through the file list
    for i in "${orig[@]}"; do
      # sed replacement to rename them appropriately, stored in
      # associative array new
      new["$i"]="`echo $i | sed -ne 's/^\([0-9]\{6,\}\)_\([0-9]\{6,\}\)_\([0-9]\{3,\}\)_\(.*\)\.pdf$/\3_\4_\1\2\.pdf/p'`"
    
      # if file was renamed (passed regex filter) then scp it to remote host,
      # saving it remotely with new name
      if [ ${new["$i"]} ]; then
        scp "${local_path}$i" "${user_mach}:${remote_path}${new["$i"]}"
        # don't roll over the return value (256 == 0 in 8 bit return value)
        [[ "$lcl_err" -lt "255" ]] && ((lcl_err+=$?))
      else
        echo "Skipping file $i"
      fi
    done
    exit "$lcl_err"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2018-03-09
      • 2015-08-03
      • 2012-09-09
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多