····if [$? -ne 0]; then # Или выйти, если каталог не существует.
······exit 1
····fi
··fi
··for file in *
··do
····if [-d "$file"]; then
······if [$size −eq 1]; then
········echo "$file ($size entry)|"
······else
········echo "$file ($size entries)|"
······fi
····else
······size="$(ls −sk "$file" | awk '{print $1}')"
····fi
··done | \
····xargs −n 2 | \
····sed 's/\^\^\^/ /g' | \
··exit 0
Как это работает
Одним из наиболее интересных элементов сценария является функция readablesize
echo "$file ($(readablesize $size))|"
Подоболочки автоматически наследуют все функции, объявленные в родительской оболочке, поэтому подоболочка, запущенная конструкцией $(), получит доступ к функции readablesize. Очень удобно.
Ближе к началу сценария
Основная логика сценария занимается организацией вывода в две колонки, выровненные по вертикали. Одна из проблем, возникающих при этом, состоит в том, что пробелы в потоке вывода нельзя просто заменить символами перевода строки, потому что имена файлов и каталогов сами могут содержать пробелы. Чтобы решить эту проблему, сценарий в
Обратите внимание, как просто в
size=$(ls "$file" | wc −l | sed 's/[^[: digit: ]]//g')
Запуск сценария
Чтобы получить список содержимого сценария, запустите сценарий без аргументов, как показано в листинге 2.13. Чтобы получить информацию о другом каталоге, передайте имя этого каталога сценарию в виде единственного аргумента командной строки.
Результаты
Листинг 2.13. Тестирование сценария formatdir
$ formatdir ~
Applications (0 entries)··············Classes (4KB)
DEMO (5 entries)······················Desktop (8 entries)
Documents (38 entries)················Incomplete (9 entries)
IntermediateHTML (3 entries)··········Library (38 entries)
Movies (1 entry)······················Music (1 entry)
NetInfo (9 entries)·················· Pictures (38 entries)
Public (1 entry)······················RedHat 7.2 (2.08GB)
Shared (4 entries)····················Synchronize! Volume ID (4KB)
X Desktop (4KB)······················ automatic-updates.txt (4KB)
bin (31 entries)······················cal-liability.tar.gz (104KB)
cbhma.tar.gz (376KB)··················errata (2 entries)
fire aliases (4KB)····················games (3 entries)
junk (4KB)····························leftside navbar (39 entries)
mail (2 entries)······················perinatal.org (0 entries)
scripts.old (46 entries)··············test.sh (4KB)