歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> linux下scp遠程拷貝包含空格的目錄或者文件的解決方法

linux下scp遠程拷貝包含空格的目錄或者文件的解決方法

日期:2017/3/1 18:04:20   编辑:Linux技術
今天遇到個白癡問題,用了linux 這麼久了,竟然還出現如此低級的錯誤。

記錄下,免得又忘記。

描述:

今天需要遠程拷貝一些文件到電腦上,ubuntu的。 遠程電腦是debian的。

文件和目錄包含大量的空格,采用scp拷貝,例:

scp -r [email protected]:/home/xxj/Documents/files/xx xx jj.tar.gz ./

最開始就意識到了是空格問題,就采用了 文件空格前加“\”,死活不行,

scp -r [email protected]:/home/xxj/Documents/files/xx\ xx\ jj.tar.gz ./

然後又使用 引號,單引號,雙引號都用了,還是不行。

scp -r [email protected]:'/home/xxj/Documents/files/xx xx jj.tar.gz' ./

scp -r [email protected]:"/home/xxj/Documents/files/xx xx jj.tar.gz" ./

最後同時 在空格前加 斜槓,整個文件目錄加引號才行

scp -r [email protected]:"/home/xxj/Documents/files/xx\ xx\ jj.tar.gz" ./

linux下帶空格文件批量cp和scp補充:

背景:主備機同步文件失敗,現在需要人工手動的在備機上補齊文件,但是發現文件名竟然有空格
主機的IP:192.168.0.90 主機文件清單名稱:src_file.txt,備機文件清單名稱:dst_file.txt,
從下面可以知道,主備機的文件路徑和文件的名稱是不一樣的,同步的時候,從src_file.txt copy到dst_file.txt需要一一對應,另備機上的目錄並不能保證都存在,所以需要先把備機上的目錄結構先創建出來
[root@station90 file]# cat src_file.txt
/home/src/10329/g0197/k/19xiazai h264.3gp
/home/src/10327/g0194/10ng h264 xiazai.3gp
/home/src/10329/g0196/lh/10xiazai h263.3gp
/home/src/101117/060/090/1011.3gp
/home/src/10520/056/0590/99833/10x_04 0_0_3.3gp

[root@station90 file]# cat dst_file.txt
/home/dst/1038/g07/k/3/10290upload h264.3gp
/home/dst/10327/g04/10ng h264 upload.3gp
/home/dst/1038/g06/lhppww/10upload h263.3gp
/home/dst/101117/06g090/1011.3gp
/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp

從dst_file.txt(備機文件)可以知道,目錄的級別不是一樣的,也就是說第一行為6級目錄,第二行卻為4級目錄,如何取出目錄結構,先創建出目錄結構呢?執行如下命令即可:
[root@station90 file]# awk -F '/' '{for (i=1;i<NF;i++) {printf $i "/"}printf "\n"}' dst_file.txt //注意i<NF,即不需要循環到最後一列,printf $i是不打印回車的,一行循環完畢後,printf "\n"會打印回車,這樣的結果剛好是我們需要的
/home/dst/1038/g07/k/3/
/home/dst/10327/g04/
/home/dst/1038/g06/lhppww/
/home/dst/101117/06g090/
/home/dst/1052g056/0590/33/
[root@station90 file]# awk '{print $1}' dst_file.txt | awk -F '/' '{print substr($0,1,(length($0)-length($NF)))}' > /tmp/dst_dir.txt
//根據dst_file.txt的特點,先執行awk '{print $1}' dst_file.txt 以空格作為分隔符,取出第一列,這樣取出的就沒有空格,$0為文本裡面包含的所有內容,再通過截取字符串的方式,substr($0(去除空格的文本本身),1(從第一個字符開始),(length($0)-length($NF))所有字符的長度減去最後一列的字符長度,就等於我們需要的字符長度,也就是從1,我們需要的字符長度,結果就是我們需要的了
[root@station90 file]# cat /tmp/dst_dir.txt
/home/dst/1038/g07/k/3/
/home/dst/10327/g04/
/home/dst/1038/g06/lhppww/
/home/dst/101117/06g090/
/home/dst/1052g056/0590/33/
[root@station90 file]# mkdir -p $(cat /tmp/dst_dir.txt)
[root@station90 file]# ls -ld $(cat /tmp/dst_dir.txt) /目錄結構已經創建出來了
drwxr-xr-x 2 root root 4096 11-10 17:37 /home/dst/101117/06g090/
drwxr-xr-x 2 root root 4096 11-10 17:37 /home/dst/10327/g04/
drwxr-xr-x 2 root root 4096 11-10 17:37 /home/dst/1038/g06/lhppww/
drwxr-xr-x 2 root root 4096 11-10 17:37 /home/dst/1038/g07/k/3/
drwxr-xr-x 2 root root 4096 11-10 17:37 /home/dst/1052g056/0590/33/

part1:單純的從本機copy到本機的其他目錄,會比較簡單,如下所示:
[root@station90 file]# sed -i -e "s/^/cp \"/g" -e "s/$/\"/g" src_file.txt //在文本中的開頭和結尾添加雙引號
[root@station90 file]# cat src_file.txt
cp "/home/src/10329/g0197/k/19xiazai h264.3gp"
cp "/home/src/10327/g0194/10ng h264 xiazai.3gp"
cp "/home/src/10329/g0196/lh/10xiazai h263.3gp"
cp "/home/src/101117/060/090/1011.3gp"
cp "/home/src/10520/056/0590/99833/10x_04 0_0_3.3gp"
[root@station90 file]# sed -i -e "s/^/\"/g" -e "s/$/\"/g" dst_file.txt //在文本中的開頭和結尾添加雙引號
[root@station90 file]# cat dst_file.txt
"/home/dst/1038/g07/k/3/10290upload h264.3gp"
"/home/dst/10327/g04/10ng h264 upload.3gp"
"/home/dst/1038/g06/lhppww/10upload h263.3gp"
"/home/dst/101117/06g090/1011.3gp"
"/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]#paste -d ' ' src_file.txt dst_file.txt > cp.sh //src_file.txt和dst_file.txt文本以空格作為分隔符合成一個文件
[root@station90 file]#cat cp.sh
cp "/home/src/10329/g0197/k/19xiazai h264.3gp" "/home/dst/1038/g07/k/3/10290upload h264.3gp"
cp "/home/src/10327/g0194/10ng h264 xiazai.3gp" "/home/dst/10327/g04/10ng h264 upload.3gp"
cp "/home/src/10329/g0196/lh/10xiazai h263.3gp" "/home/dst/1038/g06/lhppww/10upload h263.3gp"
cp "/home/src/101117/060/090/1011.3gp" "/home/dst/101117/06g090/1011.3gp"
cp "/home/src/10520/056/0590/99833/10x_04 0_0_3.3gp" "/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# sed -i "1,1s/^/\#\!\/bin\/bash\n/g" cp.sh //在腳本中添加#!/bin/bash
[root@station90 file]# cat cp.sh
#!/bin/bash
cp "/home/src/10329/g0197/k/19xiazai h264.3gp" "/home/dst/1038/g07/k/3/10290upload h264.3gp"
cp "/home/src/10327/g0194/10ng h264 xiazai.3gp" "/home/dst/10327/g04/10ng h264 upload.3gp"
cp "/home/src/10329/g0196/lh/10xiazai h263.3gp" "/home/dst/1038/g06/lhppww/10upload h263.3gp"
cp "/home/src/101117/060/090/1011.3gp" "/home/dst/101117/06g090/1011.3gp"
cp "/home/src/10520/056/0590/99833/10x_04 0_0_3.3gp" "/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# chmod +x cp.sh
[root@station90 file]# ls -l "/home/dst/1038/g07/k/3/10290upload h264.3gp" //執行cp.sh腳本前,文件是不存在的
ls: /home/dst/1038/g07/k/3/10290upload h264.3gp: 沒有那個文件或目錄
[root@station90 file]# ./cp.sh
[root@station90 file]# ls -l "/home/dst/1038/g07/k/3/10290upload h264.3gp" //ok,copy成功
-rw-r--r-- 1 root root 0 11-10 17:44 /home/dst/1038/g07/k/3/10290upload h264.3gp

part2 從遠成主機scp文件過來,先舉例一錯誤的例子,正確的總是慢慢的總結出來的
執行rm.sh,刪除剛才copy過來的文件
[root@station90 file]# cat rm.sh
#!/bin/bash
rm -f "/home/dst/1038/g07/k/3/10290upload h264.3gp"
rm -f "/home/dst/10327/g04/10ng h264 upload.3gp"
rm -f "/home/dst/1038/g06/lhppww/10upload h263.3gp"
rm -f "/home/dst/101117/06g090/1011.3gp"
rm -f "/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# ./rm.sh
[root@station90 file]# sed -i -e "s/^/scp\ root\@192\.168\.0\.90\:\"/g" -e "s/$/\"/g" src_file.txt
//在src_file.txt文件的開頭和結尾添加雙引號,同時添加[email protected]:,最終如下所示
[root@station90 file]# cat src_file.txt
scp [email protected]:"/home/src/10329/g0197/k/19xiazaih264.3gp"
scp [email protected]:"/home/src/10327/g0194/10ngh264 xiazai.3gp"
scp [email protected]:"/home/src/10329/g0196/lh/10xiazaih263.3gp"
scp [email protected]:"/home/src/101117/060/090/1011.3gp"
scp [email protected]:"/home/src/10520/056/0590/99833/10x_040_0_3.3gp"
[root@station90 file]# sed -i -e "s/^/\"/g" -e "s/$/\"/g" dst_file.txt //在文本中的開頭和結尾添加雙引號
[root@station90 file]# cat dst_file.txt
"/home/dst/1038/g07/k/3/10290upload h264.3gp"
"/home/dst/10327/g04/10ng h264 upload.3gp"
"/home/dst/1038/g06/lhppww/10upload h263.3gp"
"/home/dst/101117/06g090/1011.3gp"
"/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# paste -d ' ' src_file.txt dst_file.txt > scp.sh //合成shell腳本步驟一
[root@station90 file]# cat scp.sh
scp [email protected]:"/home/src/10329/g0197/k/19xiazaih264.3gp" "/home/dst/1038/g07/k/3/10290upload h264.3gp"
scp [email protected]:"/home/src/10327/g0194/10ngh264 xiazai.3gp" "/home/dst/10327/g04/10ng h264 upload.3gp"
scp [email protected]:"/home/src/10329/g0196/lh/10xiazaih263.3gp" "/home/dst/1038/g06/lhppww/10upload h263.3gp"
scp [email protected]:"/home/src/101117/060/090/1011.3gp" "/home/dst/101117/06g090/1011.3gp"
scp [email protected]:"/home/src/10520/056/0590/99833/10x_040_0_3.3gp" "/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# sed -i "1,1s/^/\#\!\/bin\/bash\n/g" scp.sh //合成shell腳本步驟二
[root@station90 file]# cat scp.sh //看過去沒有問題是吧,借鑒上面的part1部分cp得到scp嘛,其實是有問題的
#!/bin/bash
scp [email protected]:"/home/src/10329/g0197/k/19xiazaih264.3gp" "/home/dst/1038/g07/k/3/10290upload h264.3gp"
scp [email protected]:"/home/src/10327/g0194/10ngh264 xiazai.3gp" "/home/dst/10327/g04/10ng h264 upload.3gp"
scp [email protected]:"/home/src/10329/g0196/lh/10xiazaih263.3gp" "/home/dst/1038/g06/lhppww/10upload h263.3gp"
scp [email protected]:"/home/src/101117/060/090/1011.3gp" "/home/dst/101117/06g090/1011.3gp"
scp [email protected]:"/home/src/10520/056/0590/99833/10x_040_0_3.3gp" "/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# chmod +x scp.sh
[root@station90 file]# ./scp.sh //發現了吧,從遠程主機找不到這些文件,只有沒有空格的文件名稱才可以復制過來
scp: /home/src/10329/g0197/k/19xiazai: No such file or directory
scp: h264.3gp: No such file or directory
scp: /home/src/10327/g0194/10ng: No such file or directory
scp: h264: No such file or directory
scp: xiazai.3gp: No such file or directory
scp: /home/src/10329/g0196/lh/10xiazai: No such file or directory
scp: h263.3gp: No such file or directory
1011.3gp 100% 0 0.0KB/s 00:00
scp: /home/src/10520/056/0590/99833/10x_04: No such file or directory
scp: 0_0_3.3gp: No such file or directory

繼續錯誤的裡程,想想,肯定是空格沒有進行轉義,遂src_file.txt文件和src_file.txt文件中的空格都進行轉義,於是下面錯誤的過程來了:
[root@station90 file]# cat src_file.txt //原文件內容格式
/home/src/10329/g0197/k/19xiazai h264.3gp
/home/src/10327/g0194/10ng h264 xiazai.3gp
/home/src/10329/g0196/lh/10xiazai h263.3gp
/home/src/101117/060/090/1011.3gp
/home/src/10520/056/0590/99833/10x_04 0_0_3.3gp
[root@station90 file]# sed -i -e "s/^/\"/g" -e "s/$/\"/g" src_file.txt //文件的開頭和結尾加上雙引號
[root@station90 file]# cat src_file.txt
"/home/src/10329/g0197/k/19xiazai h264.3gp"
"/home/src/10327/g0194/10ng h264 xiazai.3gp"
"/home/src/10329/g0196/lh/10xiazai h263.3gp"
"/home/src/101117/060/090/1011.3gp"
"/home/src/10520/056/0590/99833/10x_04 0_0_3.3gp"
[root@station90 file]# sed -i "s/ /\\\ /g" src_file.txt //對空格進行轉義
[root@station90 file]# cat src_file.txt
"/home/src/10329/g0197/k/19xiazai\ h264.3gp"
"/home/src/10327/g0194/10ng\ h264\ xiazai.3gp"
"/home/src/10329/g0196/lh/10xiazai\ h263.3gp"
"/home/src/101117/060/090/1011.3gp"
"/home/src/10520/056/0590/99833/10x_04\ 0_0_3.3gp"
[root@station90 file]# cat dst_file.txt ///原文件內容格式
/home/dst/1038/g07/k/3/10290upload h264.3gp
/home/dst/10327/g04/10ng h264 upload.3gp
/home/dst/1038/g06/lhppww/10upload h263.3gp
/home/dst/101117/06g090/1011.3gp
/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp
[root@station90 file]# sed -i -e "s/^/\"/g" -e "s/$/\"/g" -e "s/ /\\\ /g" dst_file.txt //在文件開頭和結尾加雙引號和空格進行轉義
[root@station90 file]# cat dst_file.txt
"/home/dst/1038/g07/k/3/10290upload\ h264.3gp"
"/home/dst/10327/g04/10ng\ h264\ upload.3gp"
"/home/dst/1038/g06/lhppww/10upload\ h263.3gp"
"/home/dst/101117/06g090/1011.3gp"
"/home/dst/1052g056/0590/33/10x_04\ 0_0_3.3gp"
[root@station90 file]# sed -i "s/^/scp\ root\@192\.168\.0\.90\:/g" src_file.txt //對遠程文件(192.168.0.90)src_file.txt加上scp [email protected]:
[root@station90 file]# cat src_file.txt
scp [email protected]:"/home/src/10329/g0197/k/19xiazai\h264.3gp"
scp [email protected]:"/home/src/10327/g0194/10ng\h264\ xiazai.3gp"
scp [email protected]:"/home/src/10329/g0196/lh/10xiazai\h263.3gp"
scp [email protected]:"/home/src/101117/060/090/1011.3gp"
scp [email protected]:"/home/src/10520/056/0590/99833/10x_04\0_0_3.3gp"
[root@station90 file]# sed -i "1,1s/^/\#\!\/bin\/bash\n/g" scp.sh //對文件加上#!/bin/bash
[root@station90 file]# cat scp.sh
#!/bin/bash
scp [email protected]:"/home/src/10329/g0197/k/19xiazai\h264.3gp" "/home/dst/1038/g07/k/3/10290upload\ h264.3gp"
scp [email protected]:"/home/src/10327/g0194/10ng\h264\ xiazai.3gp" "/home/dst/10327/g04/10ng\ h264\ upload.3gp"
scp [email protected]:"/home/src/10329/g0196/lh/10xiazai\h263.3gp" "/home/dst/1038/g06/lhppww/10upload\ h263.3gp"
scp [email protected]:"/home/src/101117/060/090/1011.3gp" "/home/dst/101117/06g090/1011.3gp"
scp [email protected]:"/home/src/10520/056/0590/99833/10x_04\0_0_3.3gp" "/home/dst/1052g056/0590/33/10x_04\ 0_0_3.3gp"
[root@station90 file]# chmod +x scp.sh
[root@station90 file]# ./scp.sh //執行腳本,看過去是都成功了吧,但是……
19xiazai h264.3gp 100% 0 0.0KB/s 00:00
10ng h264 xiazai.3gp 100% 0 0.0KB/s 00:00
10xiazai h263.3gp 100% 0 0.0KB/s 00:00
1011.3gp 100% 0 0.0KB/s 00:00
10x_04 0_0_3.3gp 100% 0 0.0KB/s 00:00
[root@station90 file]#
[root@station90 file]# cd /home/dst/1038/g07/k/3/
[root@station90 3]# ls //看到沒有,復制到本地的文件有了\
10290upload\ h264.3gp
[root@station90 dst]# pwd
/home/dst
[root@station90 dst]# find ./ -type f
./10327/g04/10ng\ h264\ upload.3gp
./1038/g07/k/3/10290upload\ h264.3gp
./1038/g06/lhppww/10upload\ h263.3gp
./1052g056/0590/33/10x_04\ 0_0_3.3gp
[root@station90 dst]# find ./ -type f -exec rm {} \; //刪除復制過來錯誤的文件
[root@station90 dst]# find ./ -type f
[root@station90 file]# cat src_file.txt //下面的步驟是正確的,其實只需要對src_file.txt文件的空格加上\進行轉義,對本地
dst_file.txt文件只需要在文件的開頭結尾加上雙引號,就好了
/home/src/10329/g0197/k/19xiazai h264.3gp
/home/src/10327/g0194/10ng h264 xiazai.3gp
/home/src/10329/g0196/lh/10xiazai h263.3gp
/home/src/101117/060/090/1011.3gp
/home/src/10520/056/0590/99833/10x_04 0_0_3.3gp
[root@station90 file]# sed -i "s/ /\\\ /g" src_file.txt
[root@station90 file]# cat src_file.txt
/home/src/10329/g0197/k/19xiazai\ h264.3gp
/home/src/10327/g0194/10ng\ h264\ xiazai.3gp
/home/src/10329/g0196/lh/10xiazai\ h263.3gp
/home/src/101117/060/090/1011.3gp
/home/src/10520/056/0590/99833/10x_04\ 0_0_3.3gp
[root@station90 file]# sed -i -e "s/^/scp\ root\@192\.168\.0\.90\:\"/g" -e "s/$/\"/g" src_file.txt
[root@station90 file]# cat src_file.txt
scp [email protected]:"/home/src/10329/g0197/k/19xiazai\h264.3gp"
scp [email protected]:"/home/src/10327/g0194/10ng\h264\ xiazai.3gp"
scp [email protected]:"/home/src/10329/g0196/lh/10xiazai\h263.3gp"
scp [email protected]:"/home/src/101117/060/090/1011.3gp"
scp [email protected]:"/home/src/10520/056/0590/99833/10x_04\0_0_3.3gp"
[root@station90 file]# cat dst_file.txt
/home/dst/1038/g07/k/3/10290upload h264.3gp
/home/dst/10327/g04/10ng h264 upload.3gp
/home/dst/1038/g06/lhppww/10upload h263.3gp
/home/dst/101117/06g090/1011.3gp
/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp
[root@station90 file]# sed -i -e "s/^/\"/g" -e "s/$/\"/g" dst_file.txt
[root@station90 file]# cat dst_file.txt
"/home/dst/1038/g07/k/3/10290upload h264.3gp"
"/home/dst/10327/g04/10ng h264 upload.3gp"
"/home/dst/1038/g06/lhppww/10upload h263.3gp"
"/home/dst/101117/06g090/1011.3gp"
"/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# sed -i "1,1s/^/\#\!\/bin\/bash\n/g" scp.sh
[root@station90 file]# cat scp.sh //最終的腳本樣本
#!/bin/bash
scp [email protected]:"/home/src/10329/g0197/k/19xiazai\h264.3gp" "/home/dst/1038/g07/k/3/10290upload h264.3gp"
scp [email protected]:"/home/src/10327/g0194/10ng\h264\ xiazai.3gp" "/home/dst/10327/g04/10ng h264 upload.3gp"
scp [email protected]:"/home/src/10329/g0196/lh/10xiazai\h263.3gp" "/home/dst/1038/g06/lhppww/10upload h263.3gp"
scp [email protected]:"/home/src/101117/060/090/1011.3gp" "/home/dst/101117/06g090/1011.3gp"
scp [email protected]:"/home/src/10520/056/0590/99833/10x_04\0_0_3.3gp" "/home/dst/1052g056/0590/33/10x_04 0_0_3.3gp"
[root@station90 file]# chmod +x scp.sh
[root@station90 file]# ./scp.sh
19xiazai h264.3gp 100% 0 0.0KB/s 00:00
10ng h264 xiazai.3gp 100% 0 0.0KB/s 00:00
10xiazai h263.3gp 100% 0 0.0KB/s 00:00
1011.3gp 100% 0 0.0KB/s 00:00
10x_04 0_0_3.3gp 100% 0 0.0KB/s 00:00
[root@station90 file]# cd /home/dst
[root@station90 dst]# find ./ -type f //現在OK了,linux水平不行,被折磨了2天吶
./10327/g04/10ng h264 upload.3gp
./101117/06g090/1011.3gp
./1038/g07/k/3/10290upload h264.3gp
./1038/g06/lhppww/10upload h263.3gp
./1052g056/0590/33/10x_04 0_0_3.3gp
Copyright © Linux教程網 All Rights Reserved