Проверьте эту утилиту на основе Java nzip для вложенных zip-файлов. Извлечение и сжатие вложенных zip-файлов можно легко выполнить с помощью следующих команд
java -jar nzip.jar -c list -s readme.zip
java -jar nzip.jar -c extract -s "C :\project\readme.zip" -t readme
java -jar nzip.jar -c compress -s readme -t "C :\project\readme.zip"
ПС. Я автор и буду рад быстро исправить любые ошибки.
Я бы выбрал что-то вроде:
find <dir> -type f -print0 | xargs -0 sed -i '...'
вместо всего цикла until
. Тоже должно быть быстрее.
Причины, по которым я разместил альтернативу:
Не парсить ls
вывод(600+ голосов)
Я предпочел бы, чтобы в моем скрипте была одна быстрая строка, использующая системные механизмы, чем взломать собственную (возможно глючную )конструкцию многострочного -цикла.
Большинство самодельных -конструкций будут иметь проблемы либо с "файлами с пробелами", либо с проблемами с длиной аргумента.
Чтобы обрабатывать каждый аргумент отдельно в вашем скрипте, используйте цикл в своем подобном:
for pathname do
# Insert code here that uses "$pathname".
# You will not need to shift arguments.
done
Чтобы вызвать скрипт со всеми именами в текущем каталоге, используйте
./script.sh./*
Оболочка расширит шаблон ./*
до списка, содержащего все имена в текущем каталоге.
Это имеет то преимущество перед использованием ls
, что не использует ls
и, следовательно, справится с именами файлов, которые содержат любые допустимые символы, даже пробелы, символы табуляции и новые строки.
Или вы можете переместить подстановку имени файла в сам скрипт (, чтобы избежать необходимости передавать скрипту какие-либо аргументы в командной строке )с помощью
for pathname in./*; do
# Insert code here that uses "$pathname".
done
Если ваш скрипт должен различать имена, которые относятся к обычным файлам, и имена, которые относятся к чему-либо, что не является обычным файлом (, например. каталоги ), используйте тест -f
в своем цикле:
# skip non-regular files
[ ! -f "$pathname" ] && continue
Это по-прежнему позволяет использовать символические ссылки на обычные файлы. Чтобы их тоже пропустить, измените тест на
if [ ! -f "$pathname" ] || [ -L "$pathname" ]; then
# Skip non-regular files and symbolic links.
continue
fi
Другие комментарии:
Вы можете назначить многострочную -строку переменной, включив символы новой строки в строку:
boilerplate='Hello and welcome!
This is my program.
Enjoy'
Чтобы вставить текст после второй строки в текстовый документ, используйтеsed
(с помощью -i
здесь для в -место редактирования):
printf '%s\n' "$boilerplate" | sed -i '2r /dev/stdin' somefile
или, при наличии здесь -документа,
sed -i '2r /dev/stdin' somefile <<END_BOILERPLATE
Hello and welcome!
This is my program.
Enjoy
END_BOILERPLATE