2016-05-29 4 views
0

私はいくつかのPDFファイルを含む私のサーバー内のフォルダを持っています。私の問題は、私は他のサーバーにコピーして、名前を変更する必要があります。私は、各ファイルの名前を変更したい、これらのファイルをコピーしている間にコピーする(scp)と名前を変更するシェルスクリプト

名の形式は、この「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」私は、このためのシェルスクリプト(bashのを)書きたい

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

のようなものです。私にいくつかのアイデアやこれに関するサンプルスクリプトを教えてください。 GNUのtarで

+0

'scpはSOURCE_NAMEユーザーの@ REMOTE_HOST:dest_name' – anishsane

+0

それともたい場合は、' scp'ディレクトリ全体&その後、REMOTE_HOST prename @ 'sshのユーザーことができます...'コマンド – anishsane

+0

それはあなたが持っているものを追加することは常に良いことですこれまでに行われた。 [\ [mcve \]](http://stackoverflow.com/help/mcve) – sjsam

答えて

2

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

あなたが先ディレクトリの使用のtarのオプション-Cを変更したい場合。


参照:これはあなたのために働く必要のあるいくつかのマイナーな微調整してThe Stack Overflow Regular Expressions FAQ

1

。私は説明/コメントをスクリプトに入れました。おそらくループなしで実行することはできますが、複数のファイルをscpで同時に転送したり名前を変更したりするのは面倒です。それらの名前をローカルに変更して転送した場合、単一のscp呼び出しを行うのは簡単です。 1本のライナーに凝縮させることもできます。しかし私は、このアプローチがより解説的であり、変更が容易であると考えました。

#!/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/" 

# [email protected] for remote ssh connection 
user_mach="[email protected]" 

# 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" 
関連する問題