С zsh
, в обычном режиме только для записи:
for dir (*/*(N/)) (){(($#)) && tar tvf $1} $dir/*.tar.gz(Nom[1])
для var (значения) cmd
: более короткая форма для переменных значений; выполнить команду; done
(N/)
, (Nom[1])
: квалификаторы glob
N
: расширяется до нуля, если совпадений нет (nullglob) /
: только каталоги om
: порядок по времени модификации (самые новые сначала) [1]
: первое совпадение only (){...} args
: анонимные функции со своими аргументами. С инструментами GNU (по-прежнему не делающими предположений о том, какие байты могут содержать имена файлов, но обходя скрытые каталоги и включая скрытые файлы tar.gz
) и любой оболочкой, подобной Борну, эквивалентом может быть:
LC_ALL=C find . -mindepth 3 -maxdepth 3 -name '*.tar.gz' -printf '%T@:%p\0' |
sort -zn | LC_ALL=C awk -v RS='\0' -v ORS='\0' '
{match($0, ":((.*)/.*)", parts); newest[parts[2]] = parts[1]}
END {for (dir in newest) print newest[dir]}' |
xargs -r0n1 tar tvf