2014-12-01 27 views
0

我希望我的腳本將addresses.list(其中包含這些文件的絕對路徑)中的文件複製到我的folder3中添加到文件的名稱變量k(它們來自較低文件夾的名稱)。使用cp複製和更改從filelist.file中讀取的文件的名稱

該腳本對我有意義,但它不起作用,它指出:「cp:無法創建常規文件」;有什麼建議麼?

#!/bin/bash 
cd /folder1/ 

for k in $(cat lowerfolders_list); do 
    for f in $(cat addresses.lst); do 
     cp $f "/folder1/folder2/folder3/${k}_$f" 
     cd /folder1/ 
    done 
done 

確切的錯誤我得到的是這樣的「CP:無法創建常規文件`/ A/B/C/d/E /資料夾/文件夾2/folder3 /我的$ k的名稱/ path_to_my_file/myfile.sdf :沒有這樣的文件或目錄「

編輯

這將是確定的,即使我可以複製這些文件只有$ķ但是當我試圖做到這一點我的輸出是最後的文件後,對其進行命名在我的addresses.lst中多次使用我的lowerfolders_list上的每個名稱。 這是我使用的腳本:

#!/bin/bash 
cd /folder1/ 

for k in $(cat lowerfolders_list); do 
    for f in $(cat addresses.lst); do 
     cp "$f" "/folder1/folder2/folder3/${k}" 
    done 
    cd - 
done 

有什麼建議嗎?

編輯 解決

#!/bin/bash 
cd /folder1/ 

for k in $(cat lowerfolders_list); do 
    for f in $(cat addresses.lst); do 
    myfile=$(basename "$f") 
    cp "$f" "/folder1/folder2/folder3/${k}_${myfile}" 
    done 
    cd - 
done 

感謝所有作出貢獻的人。

+1

在該目錄下是否你的用戶有權限創建文件?另外你爲什麼在循環中使用'cd'? 'cp'不會改變目錄。 – 2014-12-01 16:10:19

+0

我有權這樣做,腳本末尾的cd在一個類似的腳本中爲我工作過一次,所以我將它保留在這個腳本中,但無論如何不應該影響腳本的壞方式......我想。 – alikino 2014-12-01 16:12:55

+0

在該循環中使用「touch」/ folder1/folder2/folder3/$ {k} _ $ f「'而不是'cp'是否正常工作? – 2014-12-01 16:14:24

回答

1

對不起,但保留那些爲了另一個目的而不理解他們做什麼的命令總是會讓你陷入困境。在市場營銷中,它似乎可以工作,但在計算機科學中,做一些你不明白的事情會非常快速地中斷。儘早停止練習。試着先了解什麼是目錄結構。閱讀man cdman cpman mkdir

所以cd命令是擰你的腳本,因爲它改變目錄,你讀取的文件和目錄列表最初成爲無效的路徑。但也許我有一個想法你想做什麼。

第二件事是閱讀這樣的目錄和文件列表是不安全的。如果他們的名字中有空格,它就會壞掉。但讓我們暫時離開。

然後你不創建目錄結構「/ folder1/folder2/folder3」。如果在運行腳本之前它不存在,它也會中斷。使用mkdir -p

所以你現在要做的將是類似的東西就是我最好的猜測:

for k in $(cat lowerfolders_list); do 
    cd "${k}" 
    for f in $(cat addresses.lst); do 
     cp "$f" "/folder1/folder2/folder3/${k}_$f" 
    done 
    cd - 
done 
+0

仍然無效,名稱中沒有包含空格的文件夾,並且我已經有目標文件夾。我得到的錯誤是這個cp:無法創建常規文件'/ A/B/C/D/E/folder1/folder2/folder3 /我的$ k/path_to_my_file/myfile.sdf的名稱':沒有這樣的文件或目錄 – alikino 2014-12-03 08:30:37

相關問題