2016-03-11 3 views
2

Я хочу скопировать файлы, разбросанные в отдельных каталогах, в один каталог.bash: копировать файлы с тем же шаблоном

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» не копируется.

Во-первых, я думаю, что, поскольку я использую двойную кавычку в сценарии оболочки, файлы с именами, которые содержат знак Dollor, backtick или обратную косую черту, могут быть пропущены. Затем я нахожу один файл с именем $ .... Но как найти еще три? После cd offModels и ls > ../File, я пишу питон скрипт так:

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 позволяет выполнить команду на каждом файле соответствует; вы должны использовать {}, чтобы получить имя файла и завершить команду с помощью ; (обычно написано как \; или ';', потому что bash рассматривает точки с запятой как разделители команд).

+2

Поскольку вы используете нестандартные опции для 'cp', вы также можете использовать опцию' -t' и иметь более эффективную команду: 'find -name '* .off' -exec cp --backup = numbered - t '/ full/path/to/offModels' '{}' + '. –

+0

@gniourf_gniourf Что означает '-t'? Я googled и не нашел документацию об этом. И когда я выполняю эту команду, он говорит: 'cp: незаконный вариант ---' – dudu

+0

@mizabrik Он предупреждает, что 'cp: незаконная опция-- использование: cp blala..' – dudu

Смежные вопросы