Вместо того, чтобы проверять содержимое архива перед его извлечением, вы также можете извлечь его, используя unar
, что обеспечит поведение, которое вы ищете после :по умолчанию, если архив содержит один каталог верхнего -уровня, unar
извлекает его как -, в противном случае он создает каталог с именем архива и извлекает его туда. Вы можете принудительно создать каталог во всех случаях с опцией -d
.
unar
также имеет то преимущество, что поддерживает широкий спектр форматов архивов.
С zsh
это было бы просто:
for f (schemas/core/**/*.xsd) xsdcxx cxx-tree --output-dir $f:h $f
Где $f:h
— заголовок (имя каталога )файла $f
, как в csh или vim.
Измените $f
на $f:P
и $f:h
на $f:h:P
, чтобы получить реальный путь ¹ файла и заголовка файла соответственно.
Здесь вы можете изменить schemas/core/**/*.xsd
на schemas/core/**/*.xsd(N)
(, где N
включает nullglob
для этого расширения одного глобуса ), чтобы избежать ошибки, если совпадений нет. Или (N.)
, чтобы ограничиться только обычными файлами (, исключая все другие типы файлов, такие как сокеты, FIFO, каталоги, символические ссылки и т. д. ), или (N-.)
, чтобы также включать символические ссылки на обычные файлы.
¹, то есть канонический путь к соответствующему файлу :абсолютный и символическая ссылка -свободная, как и в стандартной функции realpath()
. См. также модификаторы :a
и :A
, описанные в info zsh modifiers
, как возможные альтернативы.