我的服务器中有一个文件夹,其中包含一些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_12.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_12.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"