【问题标题】:bash: copy files with the same patternbash:复制具有相同模式的文件
【发布时间】:2016-03-11 09:27:49
【问题描述】:

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

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 &gt; ../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 的文件。这真的让我很吃惊。

【问题讨论】:

  • 也许你有文件名重复。

标签: python bash shell cp


【解决方案1】:

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

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

-exec 选项允许您对每个匹配的文件执行命令;您应该使用{} 来获取文件名并以; 结束命令(通常写为\;';',因为bash 将分号视为命令分隔符)。

【讨论】:

  • 由于您使用非标准选项来cp,您不妨使用-t 选项并拥有更高效的命令:find -name '*.off' -exec cp --backup=numbered -t '/full/path/to/offModels' '{}' +
  • @gniourf_gniourf -t 是什么意思?我用谷歌搜索并没有找到有关它的文档。当我执行这个命令时,它说:cp: illegal option---
  • @mizabrik 它警告cp: illegal option-- usage: cp blala..
  • @dudu: here's the GNU cp man page-t 选项记录在 here。关于您获得的错误:您使用的是哪个版本的cp? (你在 OS X 上吗?)
  • @gniourf_gniourf 是的,我使用的是 OS X yosemite(版本 10.10.5)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多