перейменування файлів
Ось ще один приклад: потрібно порівняти 2 каталогу. Зробити це просто, достатньо знайти всі файли (НЕ каталоги), в першому каталозі, а потім порівняти їх з однойменними файлами в іншому каталозі
тільки перед цим, командою find -type f | wc -l непогано подивитися скільки файлів в каталогах. А то слідуючи нашому алгоритму, ми не зможемо знайти "зайві" файли, які є в другому каталозі, але немає в першому.
Скрипт дуже простий, але він ілюструє деякі тонкі моменти інтеграції sed і bash'а.
Приклад 4.13. Порівняння каталогів.
Після імені першого каталогу не повинно бути слеша, це можна виправити, але мені лінь.
Тут все просто: завдяки модифікатору pe команда спочатку виводиться, а потім виконується, що-б було видно як йде процес (можна ще одну sed додати, що-б зробити красиво), а ось результат (це число, 0 якщо файли однакові) нікуди не виводиться, а перевіряється. Якщо файли однакові, ми переходимо до перевірки нової пари, а ось якщо різні - то ми виводимо код повернення і перериваємо скрипт. При цьому cmp виводить діагностичне повідомлення, ми його бачимо на терміналі, тому що воно йде в потік помилок.
застереження
Зверніть увагу на екранування $ після echo: це треба, що-б виконалася команда echo $ ?. якщо слеш нема за екранувати, то змінна $? розкриється занадто рано, і буде містити код повернення find. а зовсім не cmp. як нам потрібно. Саме через таких фокусів я терпіти не можу скрипти в подвійних лапках. Однак лапки тут потрібні: справа в тому, що наш скрипт не працює на файлах з одиночної лапками: ця лапка розбиває ім'я на дві частини, причому друга частина залишається між лапках частинами - що shell природно зрозуміти не може, і виконувати відмовляється. Найпростіше розділити таке ім'я на три частини:
- початок імені 'голова'
- одинарні лапки, що-б її передати всередину shell-команди ми її закавичіваем: " '" Одиночна лапки не працює всередині подвійних.
- Залишився 'хвіст'.
Об'єднавши все разом, ми помічаємо, що кожну одиночну лапки треба міняти на послідовність ' "'" '. Ну а так-як весь наш скрипт укладений в поодинокі лапки і взагалі-то виконується shell'ом, то подвійні лапки треба екранувати (з shell-скрипта символи передаються в утиліту sed, а з неї вони передаються в іншу, внутрішню shell). Все це робиться командою на самому початку sed-скрипта.
Однак я не вставив цю команду в свій скрипт - тому він не зможе порівнювати файли з лапками в іменах (спробуйте самі).
Ви можете пожертвувати невелику суму яндекс-грошей на рахунок 41001666004238 для оплати хостингу, інтернету, і іншого. Це звичайно добровільно, проте це набагато покращить даний документ (у мене буде більше часу для його поліпшення). Насправді, проект часто знаходиться на межі закриття, тому що ніяких грошей ніколи не приносив, і приносити не буде. Ви можете мені допомогти. Дякуємо.