bash:复制具有相同模式的文件

时间:2016-03-11 09:27:50

标签: python bash shell cp

我想将分散在不同目录中的文件复制到一个目录中。

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的文件。这真让我高兴。

1 个答案:

答案 0 :(得分:3)

看起来你有相同文件名的文件,cp只是覆盖它们。 您可以使用--backup=numbered的{​​{1}}选项;这是一个单行:

cp

find -name '*.off' -exec cp --backup=numbered '{}' '/full/path/to/offModels' ';' 选项允许您对匹配的每个文件执行命令;您应该使用-exec来获取文件的名称并使用{}结束命令(通常写为;\;,因为bash将分号视为命令分隔符。)