2015-05-10 112 views
1

使用shell腳本讀取文件,shell腳本:從遠程

如何從另一臺服務器讀取文件([email protected]:/首頁/管理/數據),並將其存儲在「文件」陣列? (第四行代碼)

1 reportTypes=(0001 0102 8902) 
2 
3 # collect all files matching expression into an array 
4 files=(Rep_[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-1].csv) 
5 
6 # take only the first hundred 
7 files=("${files[@]:0:100}") 
8 
9 shopt -s nullglob # allow a glob to expand to zero arguments 
10 
11 # echo ${files[@]} 
12 
13 for i in ${reportTypes[@]}; do 
14 printf -v val '%04d' "$i" 
15 groupFiles=($(for j in ${files[@]} ; do echo $j ; done | grep ${val})) 
16 
17 # Generate sequence file for EACH Report Type 
18 forqlift create --file="Report${val}.seq" "${groupFiles[@]}" 
19 done 

編輯:

我試圖與更換線4:但是當我生成hadoop的序列文件(使用forqlift

while IFS= read -rd '' file; do 
    files+=("$file") 
done < <(ssh [email protected] "cd /home/admin/data && printf '%s\0' Rep_[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-1].csv") 

,線18),它失敗了。

ERROR forqlift.ui.Driver - java.io.FileNotFoundException: Rep_0001_20150102_0.csv (No such file or directory) 
+0

什麼是你的問題?如果你想要匹配文件的名字而不是匹配文件的內容,'cat'肯定是錯誤的。 – tripleee

+0

我的問題是如何從另一臺服務器讀取文件。我的腳本只在將它放在我的數據所在的同一個目錄中時才起作用。 – sophie

+0

順便說一句,你應該引用擴展。 ''$ {reportTypes [@]}「',而不是空白'$ {reportTypes [@]}'。除非IFS被設置爲包含值中找到的數字的值,否則不會在這種特定情況下主動導致錯誤,但更好的方式是不會爲有史以來的錯誤導致額外的空間。 –

回答

-3

好了,現在我我的答案更改爲工作腳本:

declare -a ARRAY 

count=0; 
for F in $(ssh localhost find ./ -name "\*.sh" | xargs basename -a) ; do 
    ARRAY[$count]=$F 
    ((count++)) 
done 

ELEMENTS=${#ARRAY[@]} 

for ((i=0;i<$ELEMENTS;i++)); do 
    echo ${ARRAY[${i}]} 
done 

您正在尋找(在這個腳本* .SH)的文件會被保存到指定數組bash的數組。

這一個被測試,它的工作原理。

[email protected]:~$ ./filenames2array.sh 
[email protected] password: 
deleteme1.sh 
deleteme9.sh 
deleteme2.sh 
deleteme7.sh 
deleteme8.sh 
deleteme10.sh 
deleteme4.sh 
deleteme3.sh 
deleteme5.sh 
filenames2array.sh 
deleteme6.sh 
[email protected]:~$ 

這是寫入通過SSH連接到本地主機。您可以將本地主機更改爲您想要的任何遠程服務器。

+1

該腳本的每一行都是錯誤的。你自己試過了嗎? – geirha

3

現在重寫這個答案,現在已經清除了一些問題的含糊之處。

您希望將遠程主機中匹配模式的文件複製到本地主機,然後迭代它們。然後使用scp(或rsync)來下載它們,然後在本地進行迭代。

# this copies the matching filenames from the remote host to the current dir. The quotes are important. 
scp "[email protected]:/home/admin/data/Rep_[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-1].csv" ./ 

# Now that the files are accessible locally, you may iterate them with a for-loop 
for file in Rep_[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-1].csv; do 
    printf 'Do something with %s\n' "$file" 
done 
+0

我的問題是如何從另一臺服務器讀取文件。我的腳本只在將它放在我的數據所在的同一個目錄中時才起作用。在第4行中,我正在考慮執行「files =(ssh user @ host:path/to/files/Rep_ [0-9] ...」),但它不起作用 – sophie

+0

@sophie「從另一個文件讀取文件服務器「是不明確的。你想要文件**名稱**還是文件**內容**? – geirha

+0

這個問題是另外兩個問題的後續,並且知道他們的內容,我的看法是你已經正確解釋了它 - 儘管你可能想清除'files'而不是爲每個'val'追加'files',因爲每次對'forqlift'的調用應該只包含與立即給定'val'相關的文件名。 –

相關問題