我想将分散在不同目录中的文件复制到一个目录中。
find . -name "*.off" > offFile
while read line; do
cp "${line}" offModels #offModels is the destination directory
done < offFile
虽然文件offFile
有1831行,但cd offModels
和ls | wc -l
给出1827.我认为四个以“.off”结尾的文件不会被复制。
首先,我认为因为我在shell脚本中使用双引号,所以可能会错过名称包含dollor符号,反引号或反斜杠的文件。然后我找到一个名为$ ....的文件但是如何找到另外三个呢?在cd offModels
和ls > ../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 :(得分:3)
看起来你有相同文件名的文件,cp
只是覆盖它们。
您可以使用--backup=numbered
的{{1}}选项;这是一个单行:
cp
find -name '*.off' -exec cp --backup=numbered '{}' '/full/path/to/offModels' ';'
选项允许您对匹配的每个文件执行命令;您应该使用-exec
来获取文件的名称并使用{}
结束命令(通常写为;
或\;
,因为bash将分号视为命令分隔符。)