2012-04-11 3 views
0

У меня есть два каталога new и old с почти похожей структурой каталогов, как показано ниже, с некоторыми отличиями.Сценарий оболочки для создания патча для выбранных файлов

old 
|----1 
| |-1a.cpp 
| |-1b.cpp 
|----2 
| |-2c.cpp 
|----3 
| |-3a.cpp 
| |-3b.cpp 
|----4 
| |-4a.cpp 
| |-4b.cpp 
|----5 
| |-5a.cpp 
| |-5b.cpp 

------------ 

new 
|----1 
| |-1a.cpp 
| |-1b.cpp 
|----4 
| |-4a.cpp 
|----5 
| |-5a.cpp 
| |-5b.cpp 

В каталоге new содержатся измененные файлы. Но он поддерживает структуру каталогов old.

Как написать сценарий оболочки для создания патча с использованием утилиты diffold и new каталогов. patch должен содержать только разницу только тех файлов в каталоге new. Он не должен содержать другие файлы в каталоге old.

ответ

1
mkpatch() { 
    new=$1 
    old=${1/new/old} 
    patch=${1}.patch 
    diff "$old" "$new" > "$patch" 
} 
export -f mkpatch 

# cd to parent directory of old and new 

find new -type f -exec bash -c 'mkpatch/{}' \; 
+0

Я боюсь, что это не исправит –

+0

@LinuxPenseur: Почему бы и нет? что происходит? –

0

Следующее должно делать то, что вы хотите, я думаю.

#!/bin/sh 

OLD_DIR=old 
NEW_DIR=new 

# Make list of files, stripping off first directory in path 
find "$OLD_DIR" -type f -print | cut -d/ -f2- | sort > files-old 
find "$NEW_DIR" -type f -print | cut -d/ -f2- | sort > files-new 

# Get files that are common 
comm -1 -2 files-old files-new > files-common 

# Create list of files to diff 
sed "s/^/$OLD_DIR\//" files-common > files-to-diff-old 
sed "s/^/$NEW_DIR\//" files-common > files-to-diff-new 

# Do the diff 
paste -d ' ' files-to-diff-old files-to-diff-new | xargs -n 2 diff -u 

# Cleanup. Temp file handling should probably be done better by using 
# mktemp to generate file names and using trap to make sure the files 
# always are deleted etc. 
rm -f files-common files-new files-old files-to-diff-new files-to-diff-old 

Это простой, прямой подход с использованием нескольких временных файлов. Вы можете уйти с некоторыми из них, если хотите.

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