| XZ(1) | XZ Utils | XZ(1) |
xz, unxz, xzcat, lzma, unlzma, lzcat – Запакује или распакује „.xz“ и „.lzma датотеке
xz [опција...] [датотека...]
unxz је исто
као и xz --decompress.
xzcat је исто
као и xz --decompress --stdout.
lzma је исто
као и xz --format=lzma.
unlzma је исто
као и xz --format=lzma --decompress.
lzcat је исто
као и xz --format=lzma --decompress
--stdout.
Приликом писања скрипти које треба да распакују датотеке, препоручује се да се увек користи назив xz са одговарајућим аргументима (xz -d или xz -dc) уместо назива unxz и xzcat.
xz је алат опште употребе за запакивање података са синтаксом линије наредби сличан као gzip(1) и bzip2(1). Изворни формат датотеке је .xz формат, али стари .lzma формат који користи LZMA Utils и сирови запаковани токови без заглавља формата су такође подржани. Уз то, распакивање .lz формата који користи lzip је подржано.
xz запакује или распакује сваку датотеку у складу са изабраним режимом рада. Ако није дата ни једна датотека или је датотека file -, xz чита са стандардног улаза и записује обрађене податке на стандардни излаз. xz ће одбити (приказаће грешку и прескочити датотеку) да пише запаковане податке на стандардни излаз ако је то терминал. Слично, xz ће одбити да чита запаковане податке са стандардног улаза ако је то терминал.
Осим ако није наведено --stdout, датотеке које нису - се пишу у нову датотеку чији назив је проистекао из назива изворне датотеке:
Ако циљна датотека већ пстоји, приказује се грешка а датотека се прескаче.
Осим ако не пише на стандардни излаз, xz ће приказати упозорење и прескочити датотеку ако се нешто од следећег примењује:
Након успешног сажимања или распакивања датотеке, xz умножава власника, групу, дозволе, време приступа и време измене из изворне датотеке у циљну датотеку. Ако умножавање групе не успе, дозволе су измењене тако да циљна датотека не постане доступна корисницима који нису имали дозволу за приступ изворној датотеци. xz не подржава умножавање других метаподатака попут списка контрола приступа или проширених атрибута.
Једном када је циљна датотека успешно затворена, изворна датотека се уклања осим ако се -keep не наведе. Изворна датотека се никада не уклања ако се излаз пише на стандардни излаз или ако дође до грешке.
Слање SIGINFO или SIGUSR1 ка xz процесу чини да испише информације напредовања на стандардну грешку. Ово има ограничено коришћење све док стандардна грешка јесте терминал, коришћење --verbose приказаће аутоматски указивач напретка освежавања.
Коришћење меморије xz се мења од неколико стотина килобајта до неколико гигабајта у зависности од поставки запакивања. Поставке коришћене приликом запакивања датотеке одређују захтеве меморије распакивача. Обично распакивачу треба 5 % до 20 % количине меморије која је потребна запакивачу приликом прављења датотеке. На пример, распакивање датотеке направљене са xz -9 тренутно захтева 65 MiB меморије. Још увек, могуће је имати .xz датотеке које захтевају неколико гигабајта меморије за распакивање.
Нарочито корисници старијих система могу наћи досадном могућност коришћења врло велике меморије. Да би се спречила нежељена изненађења, xz има уграђен ограничавач коришћења меморије, који је искључен по основи. Док неки оперативни системи пружају начин за ограничавање коришћење меморије за процесе, ослањање на то сматра се да није довољно прилагодљиво (на пример, коришћење ulimit(1) за ограничавање виртуелне меморије тежи да обогаљи mmap(2)).
Ограничавач коришћења меморије се може укључити опцијом линије наредби --memlimit=ограничење. Често је најпогодније укључити ограничавач по основи постављањем променљиве окружења XZ_DEFAULTS, на пример, XZ_DEFAULTS=--memlimit=150MiB. Могуће је поставити ограничења засебно за запакивање и распакивање коришћењем --memlimit-compress=ограничење и --memlimit-decompress=ограничење. Коришћење ове две опције ван XZ_DEFAULTS је ретко корисно јер једно покретање xz не може да ради и запакивање и распакивање а --memlimit=ограничење (или -M ограничење) је краће за куцање на линији наредби.
Ако је прекорачено наведено ограничење коришћења меморије, xz ће приказати грешку а распакивање датотеке неће успети. Ако је ограничење прекорачено приликом запакивања, xz ће покушати да умањи поставке тако да се ограничење више не прекорачује (оси када се користи --format=raw или --no-adjust). На тај начин радња неће бити неуспешна осим ако је ограничење врло мало. Смањење поставке се ради у корацима који се не подударају са предподешеностима нивоа запакивања, на пример, ако је ограничење само незнатно мање од износа потребног за xz -9, поставке ће бити смањене само мало, а не све до xz -8.
Могуће је додати .xz датотеке као то. xz ће распаковати такве датотеке као да су биле једна .xz датотека.
Могуће је уметнути попуњавање између придодатих делова или након последњег дела. Попуњавање мора да се састоји од празних бајтова а величина попуњавања мора бити умножак четири бајта. Ово може бити корисно, на пример, ако је .xz датотека смештена на медијуму који мери величине датотека у блоковима од 512 бајтова.
Надовезивање и попуњавање нису дозвољени са .lzma датотекама или сировим токовима.
На већини места где се очекује аргумент целог броја, опционални суфикс је подржан да би се лако назначили велики цели бројеви. Не сме бити размака између целог броја и суфикса.
Посебна вредност max се може користити да укаже на највећу вредност целог броја подржану опцијом.
Ако је дато више опција режима рада, последња има дејства.
| Преподешеност | ВлчРчнка | ЗапакЦПЈ | ЗапакМем | РаспМем |
| -0 | 256 KiB | 0 | 3 MiB | 1 MiB |
| -1 | 1 MiB | 1 | 9 MiB | 2 MiB |
| -2 | 2 MiB | 2 | 17 MiB | 3 MiB |
| -3 | 4 MiB | 3 | 32 MiB | 5 MiB |
| -4 | 4 MiB | 4 | 48 MiB | 5 MiB |
| -5 | 8 MiB | 5 | 94 MiB | 9 MiB |
| -6 | 8 MiB | 6 | 94 MiB | 9 MiB |
| -7 | 16 MiB | 6 | 186 MiB | 17 MiB |
| -8 | 32 MiB | 6 | 370 MiB | 33 MiB |
| -9 | 64 MiB | 6 | 674 MiB | 65 MiB |
| Преподешеност | ВлчРчнка | ЗапакЦПЈ | ЗапакМем | РаспМем |
| -0e | 256 KiB | 8 | 4 MiB | 1 MiB |
| -1e | 1 MiB | 8 | 13 MiB | 2 MiB |
| -2e | 2 MiB | 8 | 25 MiB | 3 MiB |
| -3e | 4 MiB | 7 | 48 MiB | 5 MiB |
| -4e | 4 MiB | 8 | 48 MiB | 5 MiB |
| -5e | 8 MiB | 7 | 94 MiB | 9 MiB |
| -6e | 8 MiB | 8 | 94 MiB | 9 MiB |
| -7e | 16 MiB | 8 | 186 MiB | 17 MiB |
| -8e | 32 MiB | 8 | 370 MiB | 33 MiB |
| -9e | 64 MiB | 8 | 674 MiB | 65 MiB |
Произвољни ланац филтера омогућава детаљно одређивање подешавања сажимања уместо да се ослања на подешавања повезана са предподешавањима. Када је произвољни ланац филтера наведен, опције предподешавања (-0 ... -9 и -extreme) раније на линији наредби се заборављају. Ако је опција предподешавања наведена након једне или више опција произвољног ланца филтера, ново предподешавање ступа на снагу а раније наведене опције произвољног ланца филтера се заборављају.
Ланац филтера је упоредив са спојкама на линији наредби. Приликом сажимања, несажети улаз иде на први филтер, чији излаз иде на следећи филтер (ако фа има). Излаз последњег филтера бива записан у сажету датотеку. Највећи број филтера у ланцу је четири, али обично ланац филтера има само један или два филтера.
Многи филтери имају ограничења о томе где могу бити у ланцу филтера: неки филтери могу радити само као последњи филтер у ланцу, неки само као не-последњи филтер, а неки раде на било ком месту у ланцу. Овисно о филтеру, ово ограничење је или својствено дизајну филтера или постоји како би се спречили проблеми безбедности.
Произвољни ланац филтера се може навести на два различита начина. Опције --filters=филтери и --filters1=филтери ... --filters9=филтери омогућавају навођење читавог ланца опција у једној опцији коришћењем синтаксу ниске „liblzma“ филтера. Другачије, ланац филтера се може навести коришћењем једне или више појединачних опција филтера редом како се траже у ланцу филтера. То је то, редослед појединачних опција филтера је важан! Приликом дешифровања сирових токова (--format=raw), ланац филтера мора бити наведен истим редом као када је био наведен приликом сажимања. Било који појединачни филтер или опције предподешавања наведене пре опције читавог ланца (--filters=филтери) биће заборављене. Појединачни филтери наведени после опције читавог ланца ће поништити поставку ланца филтера.
Обе опције и пуног и појединачног филтера узимају филтеру специфичне опције као зарезом раздвојен списак. Додатни зарези у опцијама се занемарују. Свака опција има основну вредност, тако да треба да наведете оне које желите да измените.
Да видите читав ланац филтера и опције, користите xz -vv (тако је, користите --verbose два пута). Ово ради такође за преглед опција ланца филтера коришћених од стране предподешености.
| Филтер | Поравнање | Напомене |
| x86 | 1 | 32-бита или 64-бита x86 |
| ARM | 4 | |
| ARM-Thumb | 2 | |
| ARM64 | 4 | 4096-бита поравнање је најбоље |
| PowerPC | 4 | Само велика крајност |
| IA-64 | 16 | Itanium |
| SPARC | 4 | |
| RISC-V | 2 |
Режим робота се покреће опцијом --robot. Чини да излаз xz буде лакши за обраду другим програмима. Тренутно --robot је подржано само заједно са --list, --filters-help, --info-memory, и --version. Биће подржан за запакивање и распакивање у будућности.
xz --robot --list користи излаз раздвојен табулатором. Прва колона сваког реда садржи ниску која указује на врсту информације која се налази у том реду:
Колоне редова датотеке:
Колоне редова тока:
Колоне редова блока:
Ако је --verbose наведено два пута, додатне колоне су укључене у редовима блока. Они се не приказују са једним --verbose, јер добијање ове информације захтева много тражења и стога може бити споро:
Колоне редова сажетка:
Од xz 5.1.2alpha:
Колоне редова укупности:
Ако је --verbose наведено два пута, додатне колоне су укључене у реду укупности:
Од xz 5.1.2alpha:
Будућа издања могу додати нове врсте реда и нове колоне се могу додати постојећим врстама реда, али постојеће колоне се неће променити.
xz --robot --filters-help исписује подржане филтере у следећем формату:
филтер:опција=<вредност>,опција=<вредност>...
Сваки филтер се исписује на свом сопственом реду.
xz --robot --info-memory исписује један ред са више колона раздвојених табулатором:
У будуће, излаз xz --robot --info-memory може имати више колона, али никада више од једног реда.
xz --robot --version исписује број издања за xz и „liblzma“ у следећем формату:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
XYYYZZZS су исти у оба реда ако су xz и „liblzma“ из истог издања XZ Utils-а.
Примери: 4.999.9beta је 49990091 и 5.0.0 је 50000002.
Обавештења (без упозорења или грешака) исписано на стандардној грешци не утичу на стање излаза.
xz обрађује размаком одвојени списак опција из променљивих окружења XZ_DEFAULTS и XZ_OPT, тим редом, пре обраде опција са линије наредби. Знајте да се обрађују само опције из променљивих окружења; све што нису опције се тихо занемарује. Обрада се ради са getopt_long(3) која се користи такође за аргументе линије наредби.
Warning: By setting these environment variables, one is effectively modifying programs and scripts that run xz. Most of the time it is safe to set memory usage limits, number of threads, and compression options via the environment variables. However, some options can break scripts. An obvious example is --help which makes xz show the help text instead of compressing or decompressing a file. More subtle examples are --quiet and --verbose. In many cases it works well to enable the progress indicator using --verbose, but in some situations the extra messages create problems. The verbosity level also affects the behavior of --list.
XZ_OPT=-2v tar caf foo.tar.xz foo
XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT
Синтакса линије наредби xz је практично супер скуп lzma, unlzma и lzcat као што се налази у LZMA Utils 4.32.x. У већини случајева, могуће је заменити LZMA Utils са XZ Utils без оштећења постојећих скрипти. Има неких несагласности такође, које понекад могу довести до проблема.
Набрајање предподешености нивоа запакивања није исто у xz и LZMA Utils. Најважнија разлика је у томе како се величине речника мапирају у различитим предподешеностима. Величина речника је отприлике иста као и коришћење меморије распакивача.
| Ниво | xz | LZMA Utils |
| -0 | 256 KiB | Н/Д |
| -1 | 1 MiB | 64 KiB |
| -2 | 2 MiB | 1 MiB |
| -3 | 4 MiB | 512 KiB |
| -4 | 4 MiB | 1 MiB |
| -5 | 8 MiB | 2 MiB |
| -6 | 8 MiB | 4 MiB |
| -7 | 16 MiB | 8 MiB |
| -8 | 32 MiB | 16 MiB |
| -9 | 64 MiB | 32 MiB |
Разлике величине речника делују такође на коришћење меморије запакивање, али постоје још неке разлике између LZMA Utils и XZ Utils, што чини разлике још већим:
| Ниво | xz | LZMA Utils 4.32.x |
| -0 | 3 MiB | Н/Д |
| -1 | 9 MiB | 2 MiB |
| -2 | 17 MiB | 12 MiB |
| -3 | 32 MiB | 12 MiB |
| -4 | 48 MiB | 16 MiB |
| -5 | 94 MiB | 26 MiB |
| -6 | 94 MiB | 45 MiB |
| -7 | 186 MiB | 83 MiB |
| -8 | 370 MiB | 159 MiB |
| -9 | 674 MiB | 311 MiB |
Основни ниво предподешености у LZMA Utils је -7 док у XZ Utils је -6, тако да оба користе 8 MiB речник по основи.
Незапакована величина датотеке се може чувати у .lzma заглављу. LZMA Utils то ради приликом запакивања обичних датотека. Алтернатива је да се означи та незапакована величина као непозната и да се користи означавач краја утовара да назначи где распакивач треба да стане. LZMA Utils користи ову методу када незапакована величина није позната, што је случај, на пример, у спојкама.
xz подржава распакивање .lzma датотека са или без означавача краја утовара, али ће све .lzma датотеке направљене са xz користити означавач краја утовара и означити незапаковану величину непознатом у .lzma заглављу. Ово може бити проблем у неким неуобичајеним ситуацијама. На пример, .lzma распакивач у угнежденом уређају може радити само са датотекама које имају незапаковану величину. Ако наиђете на тај проблем, треба да користите LZMA Utils или LZMA SDK да направите .lzma датотеке са познатом незапакованом величином.
Формат .lzma омогућава lc вредности све до 8, а lp вредности све до 4. LZMA Utils може да распакује датотеке са било којим lc и lp, али увек прави датотеке са lc=3 и lp=0. Прављење датотека са другим lc и lp је мгуће са xz и са LZMA SDK.
Примена филтера LZMA1 у „liblzma“ захтева да збир lc и lp не сме да премаши 4. Стога, .lzma датотеке, које премаше ово ограничење, не могу да се распакују са xz.
LZMA Utils прави само .lzma датотеке које имају величину речника од 2^n (степен 2) али прихвата датотеке са било којом величином речника. „liblzma“ прихвата само .lzma датотеке које имају величину речника од 2^n или 2^n + 2^(n-1). Ово је да се смање лажни позитивни резултати приликом откривања .lzma датотека.
Ова ограничења не би требало да буду проблем у пракси, јер су практично све .lzma датотеке запаковане са поставкама које ће „liblzma“ прихватити.
Приликом распакивања, LZMA Utils тихо занемарује све после првог .lzma тока. У већини прилика, ово је грешка. Ово такође значи да LZMA Utils не подржава распакивање надовезаних .lzma датотека.
Ако су остали подаци након првог .lzma тока, xz сматра да је датотека оштећена осим ако је коришћено --single-stream. Ово може прекинути нејасне скрипте које су претпоставиле да је пратеће смеће занемарено.
Тачан запаковани излаз добијен из исте незапаковане улазне датотеке може се разликовати између XZ Utils издања чак и ако су опције запакивања истоветне. Ово је због тога што шифрер може бити побољшан (брже и боље запакивање) а да не утиче на формат датотеке. Излаз се може разликовати између различитих изградњи истог XZ Utils издања, ако су коришћене другачије опције изградње.
Ово изнад значи да када се --rsyncable једном примени, резултирајућа датотека неће неопходно бити r-ускладива осим ако и стара и нова датотека нису запаковане истим xz издањем. Овај проблем може бити поправљен ако је део примене шифрера замрзнут да држи r-ускладив излаз стабилним кроз xz издања.
Примена угнежденог .xz распакивача као што је XZ Embedded неопходно не подржава датотеке направљене врстама провере целовитости осим none и crc32. Како је основно --check=crc64, морате да користите --check=none или --check=crc32 када правите датотеке за угнеждене системе.
Споља уграђени системи, сви распакивачи .xz формата подржавају све врсте провере, или барем могу да распакују датотеку без испитивања провере целовитости ако одређена провера није подржана.
XZ Embedded подржава BCJ филтере, али само са основним померајем почетка.
Запакује датотеку foo у foo.xz користећи основни ниво запакивања (-6), и уклања foo ако је запакивање успешно:
xz foo
Распакује bar.xz у bar и не уклања bar.xz чак и када је распакивање успешно:
xz -dk bar.xz
Ствара baz.tar.xz са предподешавањем -4e (-4 --extreme), које је спорије него основно -6, али захтева мање меморије за запакивање и распакивање (48 MiB и 5 MiB):
tar cf - baz | xz -4e > baz.tar.xz
Мешавина сажетих и несажетих датотека се може распаковати на стандардни излаз једном наредбом:
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
На GNU и *BSD, find(1) и xargs(1) се могу користити за паралелно запакивање више датотека:
find . -type f \! -name '*.xz' -print0 \
| xargs -0r -P4 -n16 xz -T1
Опција -P за xargs(1) поставља број паралелних xz процеса. Најбоља вредност за опцију -n зависи од тога колико датотека има за запакивање. Ако има само неколико датотека, вредност би вероватно требала да буде 1; са више хиљада датотека, 100 или чак и више може бити одговарајуће за смањење броја xz процеса које би xargs(1) евентуално направио.
Опција -T1 за xz је ту да га примора на једнонитни режим, јер се xargs(1) користи за контролу количине паралелизације.
Израчунава колико је бајтова укупно сачувано након запакивања више датотека:
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
Скрипта може желети да зна да користи најновији xz. Следећа скрипта sh(1) проверава да ли је број издања xz алата барем 5.0.0. Ова метода је сагласна са старим бета издањима која не подржавају --robot опцију:
if ! eval "$(xz --robot --version 2> /dev/null)" ||
[ "$XZ_VERSION" -lt 50000002 ]; then
echo "Ваш „xz“ је превише стар." fi unset XZ_VERSION LIBLZMA_VERSION
Поставља ограничење коришћења меморије за распакивање коришћењем XZ_OPT, али ако је ограничење већ постављено, не повећава је:
NEWLIM=$((123 << 20)) # 123 MiB OLDLIM=$(xz --robot --info-memory | cut -f3) if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then
XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM"
export XZ_OPT fi
Најједноставнија употреба за произвољне ланце филтера прилагођава LZMA2 предподешеност. Ово може бити корисно, јер предподешености покривају само подскуп потенцијално корисних комбинација поставки запакивања.
Колоне ЗапакЦПЈ у табелама из описа опција -0 ... -9 и --extreme су корисне приликом прилагођавања LZMA2 предподешености. Овде су значајни делови прикупљени из те две табеле:
| Преподешеност | ЗапакЦПЈ |
| -0 | 0 |
| -1 | 1 |
| -2 | 2 |
| -3 | 3 |
| -4 | 4 |
| -5 | 5 |
| -6 | 6 |
| -5e | 7 |
| -6e | 8 |
Ако знате да датотека захтева нешто велики речник (на пример, 32 MiB) за добро запакивање, али желите да је запакујете брже него што би то xz -8 урадио, предподешеност са ниском вредношћу ЗапакМем (на пример, 1) може се изменити да користи већи речник:
xz --lzma2=preset=1,dict=32MiB foo.tar
Са одређеним датотекама, горња наредба може бити бржа од xz -6 а запакивање значајно боље. Међутим, мора бити наглашено да само неке датотеке имају корист од великог речника док одржавају вредност ЗапакЦПЈ ниском. Најочигледнија ситуација, у којој велики речник може доста помоћи, јесте архива која садржи врло сличне датотеке где свака има најмање неколико мегабајта. Величина речника треба да буде значајно већа од сваке засебне датотеке да би се омогућило да LZMA2 има потпуну предност од сличности између узастопних датотека.
Ако је веома велико коришћење меморије запакивача и распакивача у реду, а датотека која се запакује је барем неколико стотина мегабајта, може бити корисно користити још већи речник од 64 MiB који ће xz -9 користити:
xz -vv --lzma2=dict=192MiB big_foo.tar
Коришћење -vv (--verbose --verbose) као у горњем примеру може бити корисно да се виде захтеви за меморијом запакивача и распакивача. Знајте да је коришћење речника већег од величине незапаковане датотеке губитак меморије, тако да горња наредба није корисна за мале датотеке.
Понекад време запакивања није важно, али коришћење меморије распакивача треба да се одржава ниским, на пример, да би се учинило могућим распакивање датотеке на угнежденом систему, Следеће наредбе користе -6e (-6 --extreme) као основу и постављају речник на само 64 KiB. Резултујућа датотека се може распаковати са XZ Embedded (због тога је ту --check=crc32) користећи око 100 KiB меморије.
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
Ако желите да исцедите што је више могуће бајтова, дотеривање броја битова контекста литерала (lc) и броја битова положаја (pb) може понекад да помогне. Дотеривање броја битова положаја литерала (lp) може такође да помогне, али обично lc и pb су важнији. На пример, архива извора кода садржи углавном US-ASCII текст, тако да нешто као следеће може да да незнатно (око 0.1 %) мању датотеку него xz -6e (пробајте такође без lc=4):
xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar
Коришћење још једног филтера заједно са LZMA2 може побољшати запакивање са одређеним врстама датотека. На пример, за запакивање x86-32 или x86-64 дељене библиотеке коришћењем x86 BCJ филтера:
xz --x86 --lzma2 libfoo.so
Знајте да поредак опција филтера има значај. Ако је --x86 наведено након --lzma2, xz ће дати грешку, јер не сме бити никаквог филтера после LZMA2, и такође зато што се x86 BCJ филтер не може користити као последњи филтер у ланцу.
Delta филтер заједно са LZMA2 може дати добре резултате са битмап сликама. Требало би обично да надјача PNG, који има нешто више напредних филтера него једноставни делта али користи Deflate за стварно запакивање.
Слика треба да се сачува у незапакованом формату, на пример, као незапакована TIFF. Параметар растојања Delta филтера је постављен да се подудари са бројем бајтова по пикселу у слици. На пример, RGB битмапа од 24 бита захтева dist=3, а такође је добро проследити pb=0 за LZMA2 да се прилагоди поравнање од три бајта:
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
Ако је више слика стављено у једну архиву (на пример, .tar), Delta филтер ће радити на томе такође све док све слике не буду имале исти број бајтова по пикселу.
xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)
XZ Utils: <https://tukaani.org/xz/>
XZ Embedded: <https://tukaani.org/xz/embedded.html>
LZMA SDK: <https://7-zip.org/sdk.html>
| 2025-03-08 | Tukaani |