Отображать только файлы и Dot-файлы в стандартном формате команды "ls"? - PullRequest
0 голосов
/ 14 сентября 2018

РЕДАКТИРОВАТЬ 2: Для тех, кто задает тот же вопрос, обязательно прочитайте комментарии к принятому ответу, так как они более подробно рассказывают о том, как правильно использовать команду.Я опубликую окончательный сценарий, как только он будет сделан с моим собственным объяснением того, что происходит.

Я пытаюсь написать простую функцию bash, которая очищает экран терминала, а затем выполняет несколько команд ls дляпоказать разные типы содержимого текущего каталога разными цветами.

Мне удалось написать что-то на Python, что делает то же самое, но у него есть некоторые большие недостатки (в частности, поведение специальных символов)в Cygwin в именах файлов указано «iffy», и это затрудняет правильное размещение на экране).Я хочу, чтобы это выглядело примерно так:

Python Example

* С не точечными файлами зеленого цвета (не включайте их в скриншот по соображениям конфиденциальности).

Мне удалось перечислить как скрытые каталоги, так и видимые каталоги, но файлы доставляют мне проблемы.Каждый метод использования ls для получения всех файлов, которые я пробовал, использует аргумент -l или что-то вроде find или grep, все из которых выводят файлы в одном столбце (не то, что я хочу).

Можно ли использовать команду ls (или что-то еще) для вывода только файлов или точечных файлов каталога, сохраняя формат вывода ls по умолчанию?

EDIT 1: Вот как выглядит скрипт в данный момент (пока не очень, но некоторые люди хотят его увидеть)

function test() {
    clear;

    GOLD=229;
    RED=203;
    BLUE=39;
    WHITE=15;
    GREEN=121;

    # Colored legend.
    tput sgr0;
    tput setaf bold
    # echo's "-n" suppresses the new line at the end.
    tput setaf $GOLD;
    echo -n "Working Directory ";
    tput setaf $RED;
    echo -n "Hidden Directories ";
    tput setaf $BLUE;
    echo -n "Visible Directories ";
    tput setaf $WHITE;
    echo -n "Hidden Files ";
    tput setaf $GREEN;
    echo "Visible Files";

    pwd;

    ls -d .*/; # List hidden directories.
    ls -d */; # List visible directories.
    # List dotfiles.
    # List files.
}

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Для не скрытых файлов и каталогов, попробуйте

ls -d *

Для скрытых файлов и каталогов используйте

ls -d .*
0 голосов
/ 18 сентября 2018

Используя ответ , предоставленный 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.

enter image description here

Заключительные замечания:

Он чувствует себя немного медленнее, чем мой скрипт на Python, но он не будет отображаться со специальными символами в именах файлов и всегда будет учитывать размер окна терминала, поскольку именно это ls делает. Я думаю, что «медлительность» может заключаться в том, что операции 4 xargs ls не печатаются одновременно, а на питоне - все сразу. Я могу жить с этим, будучи 1-2 секунды против 0,5-1 секунды.

0 голосов
/ 15 сентября 2018

для отображения только файлов точек в текущем каталоге

find .  -maxdepth 1 -type f -name ".*" | xargs ls --color=tty

для отображения только других файлов

find .  -maxdepth 1 -type f -not -name ".*" | xargs ls --color=tty
...