Настал день, когда мне пришлось написать скрипт BASH, который обходит произвольные деревья каталогов и просматривает произвольные файлы и пытается определить что-то в отношении сравнения между ними. Я думал, что это будет простая пара часов вершин! процесс - не так!
Мое зависание в том, что иногда какой-то идиот -ахем! - извините, прекрасный пользователь выбирает ставить пробелы в именах каталогов и файлов. Это приводит к сбою моего сценария.
Идеальное решение , кроме угрозы гильотине для тех, кто настаивает на использовании пробелов в таких местах (не говоря уже о парнях, которые помещают это в код операционной системы!), Может быть рутиной, которая «экранирует» имена файлов и каталогов для нас, вроде того, как у cygwin есть процедуры для преобразования из unix в форматы имен файлов dos. Есть ли что-нибудь подобное в стандартном дистрибутиве Unix / Linux?
Обратите внимание, что простая конструкция for file in *
не работает так хорошо, когда кто-то пытается сравнить деревья каталогов, так как она ONLY работает с "текущим каталогом" - и, в этом случае, как и во многих другие, постоянно переписывающиеся в различные каталоги, приносят свои проблемы. Итак, выполняя домашнее задание, я нашел этот вопрос Обработка специальных символов в bash для ... в цикле , и предлагаемое решение зависает на пробелах в именах каталогов, но может быть просто преодолено следующим образом:
dir="dirname with spaces"
ls -1 "$dir" | while read x; do
echo $x
done
ОБРАТИТЕ ВНИМАНИЕ: Приведенный выше код не особенно хорош, потому что переменные, используемые внутри цикла while, недоступны вне цикла while. Это связано с тем, что подразумеваемая подоболочка создается, когда вывод команды ls передается по конвейеру. Это ключевой мотивирующий фактор для моего запроса!
... Хорошо, приведенный выше код помогает во многих ситуациях, но "экранирование" символов также будет довольно мощным. Например, приведенный выше каталог может содержать:
dir\ with\ spaces
Это уже существует, и я только что пропустил это?
Если нет, у кого-нибудь есть простое предложение написать его - может быть, с помощью sed или lex? (Я далеко не компетентен с любым.)