繁体   English   中英

要复制(scp)并重命名的Shell脚本

[英]Shell script to copy(scp) and rename

我的服务器上有一个文件夹,其中包含一些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)。 请给我一些想法或与此相关的一些示例脚本。

使用GNU tar:

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

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


请参阅: 堆栈溢出正则表达式常见问题解答

进行一些细微的调整,这应该适合您。 我将解释/注释放在脚本中。 您可能没有循环就可以做到这一点,但是同时使用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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM