См. Ограничить поиск POSIX определенной глубиной? для стандартного эквивалента предиката GNU find
's -maxdepth
. Так вот:
(cd /Test && find. ! -name. -prune -type d -name '???') | sed 's|\./||'
Или, если установлено zsh
:
zsh -c 'printf "%s\n" /Test/???(D/:t)'
xargs
, вероятно, худшая утилита POSIX, когда речь идет о переносимости (и дизайне интерфейса ). Я бы держался подальше от этого. Как насчет:
<file.hex awk -v q="'" -v ORS= '
BEGIN{
for (i=0; i<256; i++) c[sprintf("%02x", i)] = sprintf("\\%o", i)
}
NR % 50 == 1 {print sep"printf "q; sep = q"\n"}
{print c[$0]}
END {if (sep) print q"\n"}
' | sh
вместо этого например?
Часть awk
выводит что-то вроде:
printf '\61\12\62\12\63\12\64\12\65\12\66\12\67\12\70\12\71\12\61\60\12\61\61\12\61\62\12\61\63\12\61\64\12\61\65\12\61\66\12\61\67\12\61\70\12\61\71\12\62\60'
printf '\12\62\61\12\62\62\12\62\63\12\62\64\12\62\65\12\62\66\12\62\67\12\62\70\12\62\71\12\63\60\12\63\61\12\63\62\12\63\63\12\63\64\12\63\65\12\63\66\12\63'
printf '\67\12\63\70\12\63\71\12\64\60\12\64\61\12\64\62\12\64\63\12\64\64\12\64\65\12\64\66\12\64\67\12\64\70\12\64\71\12\65\60\12\65\61\12\65\62\12\65\63\12'
printf '\65\64\12\65\65\12\65\66\12\65\67\12\65\70\12\65\71\12\66\60\12\66\61\12\66\62\12\66\63\12\66\64\12\66\65\12\66\66\12\66\67\12\66\70\12\66\71\12\67\60'
printf '\12\67\61\12\67\62\12\67\63\12\67\64\12\67\65\12\67\66\12\67\67\12\67\70\12\67\71\12\70\60\12\70\61\12\70\62\12\70\63\12\70\64\12\70\65\12\70\66\12\70'
printf '\67\12\70\70\12\70\71\12\71\60\12\71\61\12\71\62\12\71\63\12\71\64\12\71\65\12\71\66\12\71\67\12\71\70\12\71\71\12\61\60\60\12'
Для sh
интерпретации. В реализациях sh
, где printf
встроен, это не будет создавать дополнительные процессы. В тех случаях, когда это не так, эти строки должны быть более чем достаточно короткими, чтобы избежать ограничения ARG _MAX, но все же не запускать более одной printf
на каждые 50 байтов.
Обратите внимание, что вы не можете реально определить максимальную длину командной строки, основываясь только на значении ARG _MAX. То, как этот предел достигается и обрабатывается, во многом зависит от системы и ее версии. На многих ARG _MAX находится на пределе совокупного размера, включая список указателей argv[]
и envp[]
(, поэтому обычно 8 байт на аргумент/переменную в 64-битной системе )плюс размер каждая строка arg/env в байтах (, включая разделитель NUL ).Linux также имеет независимое ограничение на размер одного аргумента.
Также обратите внимание, что замена \12
на \n
, например, действительна только в системах на основе ASCII -. POSIX не определяет кодировку символов (, кроме NUL ). Все еще существуют системы POSIX, использующие некоторые варианты EBCDIC вместо ASCII.