2016-03-11 9 views
2

我想將分散在不同目錄中的文件複製到單個目錄中。bash:複製具有相同模式的文件

find . -name "*.off" > offFile 
while read line; do 
    cp "${line}" offModels #offModels is the destination directory 
done < offFile 

雖然文件offFile有1831行,但cd offModelsls | wc -l給1827,我認爲四個文件結束與「.off」不會被複制。

起初,我認爲因爲我在shell腳本中使用了雙引號,所以名稱中包含dollor符號,反引號或反斜線的文件可能會丟失。然後我找到一個名爲$ ....的文件,但是如何找到另外三個文件? cd offModelsls > ../File後,我寫了一個python腳本是這樣的:

fname1="offFile" #records files scattered 
with open(fname1) as f1: 
    contents1=f1.readlines() 
fname2="File" 
with open(fname2) as f2: 
    contents2=f2.readlines() 
visited=[0]*len(contents1) 
for substr in contents2: 
    substr="/"+substr 
    for i, string in enumerate(contents1): 
    if string.find(substr)>=0: 
     visited[i]=1 
     break 
for i,j in enumerate(visited): 
    if j==0: 
    print contents1[i] 

輸出提供了四根線,而他們是錯誤的。但是我可以找到目標目錄中的所有四個文件。

編輯
作爲註釋,回答指出,有四個文件與其他四個重複的名字。有一件事現在讓我感興趣的是,用我使用的bash腳本,複製了名稱爲$CROSS.off的文件。這讓我真的很驚訝。

+0

也許你有重複名稱的文件。 – luoluo

回答

2

看起來您的文件具有相同的文件名,而cp只是覆蓋它們。 您可以使用--backup=numbered選項cp;這裏是一個班輪:

find -name '*.off' -exec cp --backup=numbered '{}' '/full/path/to/offModels' ';' 

-exec選項允許你在每一個匹配的文件執行的命令;您應該使用{}來獲取文件名並通過;(通常寫爲\;或​​3210,因爲bash將分號視爲命令分隔符)結束命令。

+2

既然你使用'cp'的非標準選項,你可以使用'-t'選項並且有一個更高效的命令:'find -name'* .off'-exec cp --backup =編號 - t'/ full/path/to/offModels''{}'+'。 –

+0

@gniourf_gniourf'-t'是什麼意思?我搜索了一下,沒有找到關於它的文檔。當我執行這個命令時,它說:'cp:非法選項---' – dudu

+0

@mizabrik它警告''cp:非法選項 - 用法:cp blala..' – dudu

相關問題