2016-03-11 13 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

相关问题