2012-06-17 3 views
0

Я хочу написать скрипт, который сравнивает два каталога. Однако имена файлов изменены в одном из них. Итак, каталог A содержит файлы, такие как HouseFile.txt, CouchFile.txt, ChairFile.txt Каталог B содержит House.txt, Couch.txt, Chair.txt (который следует рассматривать как «эквивалент» выше) Оба могут также содержат новые, совершенно разные файлы.Использование сценария для сравнения каталогов с измененными именами файлов?

Может ли кто-нибудь указать мне в правильном направлении здесь? Прошло много времени с тех пор, как я сделал скрипты.

Я пробовал использовать diff, и я знаю, что мне нужно использовать некоторую форму regex, чтобы сравнить имена файлов, но я не уверен, с чего начать.

Спасибо!

Добавлены разъяснения:

diff Конечно же, просто сравнивает фактические имена файлов. Я хотел бы знать, как указать, что я рассматриваю имена файлов, такие как, например, «HouseFile.txt» и «House.txt» как эквивалентные в этом случае

+0

Что вы получите после попытки 'diff'? Как далеко вы добрались? – Alexander

+0

Конечно, diff просто сравнивает фактические имена файлов. Я хотел бы знать, как указать, что в этом случае я рассматриваю имена файлов, такие как, например, «HouseFile.txt» и «House.txt». – franka

ответ

2

Если я правильно понимаю, это возможное решение для сравнения а к Ь:

mkdir a b ; touch a/HouseFile.txt a/ChairFile.txt a/CouchFile.txt a/SomeFile.txt b/House.txt b/Chair.txt b/Couch.txt b/Sofa.txt

for file in a/*(.); do [[ ! -f b/${${file##*/}:[email protected]@} ]] && echo $file ; done

Выходы: a/SomeFile.txt

Что мне не ясно: это разница погладить tern строго «Файл» или любая произвольная строка?

EDIT: предыдущий был для zsh. Вот один для Баша:

find a -type f -maxdepth 1 | while read file; do 
    check=$(echo $file | sed -r -e '[email protected](.*)/(.*)@\[email protected]' -e "[email protected]@@") ; 
    [[ ! -f b/${check} ]] && echo $file 
done 

Используя разложение параметра вместо sed:

find a -type f -maxdepth 1 | while read file; do 
    check=${file/%File.txt/.txt} #end of file name changed 
    check=${check/#*\//} #delete path before the first slash 
    [[ ! -f b/${check} ]] && echo $file 
done 
+0

строго «файл». – franka

+0

К сожалению, я получаю синтаксическую ошибку «неожиданно» за ваш ответ. Не могли бы вы дважды проверить это? Благодаря! – franka

+0

Жаль, что это было для zsh, а не для bash. Позвольте мне проверить bash один для вас ... – Bgs