Используя ответ , предоставленный matzeri , мне удалось получить хорошее начало.Этот ответ все еще принят, потому что он ответил на вопрос, который я задал.Вот текущая версия скрипта, которую я превратил в функцию для быстрого доступа.Я собираюсь пройтись по нему и объяснить некоторые вещи, которые нужно было изменить из ответа, чтобы дать мне результат, который я хотел, но конкретно не просил.
c() {
stty -echo; # Disable keyboard inputs during function.
local HAS_DOTDIRS=false;
local HAS_DIRS=false;
local HAS_DOTFILES=false;
local HAS_FILES=false;
local BLUE=39;
local GOLD=229;
local GREEN=121;
local PINK=170;
local RED=203;
local WHITE=15;
local CYG_CWD=$(pwd);
local WIN_CWD=$(cygpath -w "$(pwd)" | sed 's/\\/\//g');
local DOTDIRS=$(ls -Ad .*/); # Get directories with '.' prefix.
local DIRS=$(ls -Ad */); # Get normal directories.
local DOTFILES=$(find . -maxdepth 1 -type f -name ".*" | sed 's/^..//');
local FILES=$(find . -maxdepth 1 -type f -not -name ".*" | sed 's/^..//');
clear;
tput sgr0;
tput setaf bold;
local LEGEND="$(tput setaf $GOLD)Cygwin Working Directory ";
LEGEND+="$(tput setaf $PINK)Windows Working Directory ";
if ! [ -z "$DOTDIRS" ] ; then
HAS_DOTDIRS=true
LEGEND+="$(tput setaf $RED)Hidden Directories ";
fi
if ! [ -z "$DIRS" ] ; then
HAS_DIRS=true
LEGEND+="$(tput setaf $BLUE)Visible Directories ";
fi
if ! [ -z "$DOTFILES" ] ; then
HAS_DOTFILES=true
LEGEND+="$(tput setaf $WHITE)Hidden Files ";
fi
if ! [ -z "$FILES" ] ; then
HAS_FILES=true
LEGEND+="$(tput setaf $GREEN)Visible Files";
fi
echo $LEGEND;
echo "";
echo "$(tput setaf $GOLD)$CYG_CWD";
echo "$(tput setaf $PINK)$WIN_CWD";
tput setaf $RED
ls_list "$HAS_DOTDIRS" "$DOTDIRS"
tput setaf $BLUE
ls_list "$HAS_DIRS" "$DIRS"
tput setaf $WHITE
ls_list "$HAS_DOTFILES" "$DOTFILES"
tput setaf $GREEN
ls_list "$HAS_FILES" "$FILES"
tput sgr0;
stty echo; # Enable keyboard inputs after function.
}
ls_list() {
# $1 - boolean - condition to print
# $2 - list - names to 'ls'
if $1 ; then
echo "$2" | xargs -d '\n' ls -d;
fi
}
Во-первых, я завернул все* * * * * * * * * * * * * * *
* * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}, тем самым поэтому я создаю логические значения, которые позволят выводить ls
в конце с минимальной задержкой междуих (if [ bool ]
вместо проверки состояния списка).
Переменные цвета просто используются командой tput
, которая позволяет изменить цвет текста терминала.
Примечание: Некоторые значения цвета могут быть отключены, потому что у меня были проблемы с моей темой Cygwin (в настоящее время используется Nord ), и эти значения выглядят как ихимена на моей установке.Ваш пробег может варьироваться.
Другим пользователям Cygwin: У меня было несколько проблем с tput
, когда он не работал, если бы он работал на реальной машине с Linux.Если у вас возникли проблемы с tput
, рассмотрите возможность определения LS_COLORS
(который можно отформатировать так, чтобы он принимал значения RGB) и установки переменной CLICOLOR
в значение true, а затем экспортируйте оба.Это может заменить команду tput
, хотя теперь вы, возможно, захотите сохранить начальное значение обоих параметров, и вам придется постоянно экспортировать переменную LS_COLORS
.
CYG_CWD
и WIN_CWD
естьпотому что пути Cygwin не совпадают с путями Windows, и мне нравится иметь оба.Команда sed
заменяет Windows \ "\" на "/" для простого копирования + вставки.
Здесь начинается ответ на вопрос.Переменные DOTDIRS
, DIRS
, DOTFILES
и FILES
получат списки.
Команда ls
уже позволяет нам фильтровать только каталоги и каталоги, начиная с .
, с помощью команд ls -Ad */
и ls -Ad *./
.ls
игнорирует файлы, начинающиеся с .
, если не указано (как я), заканчивающиеся /
поисками каталогов, а параметр -d
делает его именем каталогов вместо того, чтобы показывать нам, что в них.
Что касается точечных файлов и обычных файлов, ls
на самом деле не позволяет нам их получить, потому что вы не можете указать символ, который определяет файл, как вы можете с помощью /
для каталогов.Вместо этого мы можем использовать find . -maxdepth -type f
с соответствующим использованием аргументов -name
или -not -name
для фильтрации наших файлов. Однако существует проблема: команда преобразует результаты в ./
.Так что .bashrc
становится ./.bashrc
.Я не хочу этогоТаким образом, выходные данные передаются в команду sed
, которая заменяет первые два символа на пустые (эффективно их удаляя).
Здесь мы просто определяем, в каком списке есть элементы, устанавливаем соответствующие логические значения, чтобыбыстрый вывод ls
в конце, печать легенды, все время меняя цвета, которые терминал использует с помощью команды tput
.
В конце концов, вызывается функция ls_list
.Если заданный логический тип равен true, он выполняет команду echo "$2" | xargs -d '\n' ls -d
.По сути, он повторяет список найденных элементов, который передается в команду xargs -d '\n'
.xargs
позволяет нам передавать передаваемые ему значения в качестве параметров команды ls
.Аргументы -d '\n'
изменяют разделитель с пробелов на новые строки, поскольку в некоторых именах могут быть пробелы.Когда вы задаете имена файлов, ls
просто печатает их в обычном формате вывода ls
(именно это я и хочу).Я добавил параметр -d
, чтобы имена каталогов вместо показа их содержимого, так как я использую эту функцию для всех своих списков.
Наконец, сбросьте все, что tput
с sgr0
, и повторно-ключить клавиатурные входы с stty
!
Вот как выглядит вывод для моего каталога /home
.
Заключительные замечания:
Он чувствует себя немного медленнее, чем мой скрипт на Python, но он не будет отображаться со специальными символами в именах файлов и всегда будет учитывать размер окна терминала, поскольку именно это ls
делает. Я думаю, что «медлительность» может заключаться в том, что операции 4 xargs ls
не печатаются одновременно, а на питоне - все сразу. Я могу жить с этим, будучи 1-2 секунды против 0,5-1 секунды.