Я должен найти только каталоги в каталоге, но исключить соединенный каталог и его ссылку

Вы можете добавить в свою среду список необходимых функций.

Создайте файл ~ / .bash_functions и загрузите его из ~. / Bashrc .
Так же, как источник ./ bash_aliases :

if [ -f ~/.bash_functions ]; then
    . ~/.bash_functions
fi

Затем определите столько (и столько сложных) функций, сколько захотите.
Вы можете определить псевдонимы (внутри ~ / .bash_aliases, чтобы поддерживать порядок) для функций. Но на самом деле это не нужно, поскольку вы можете напрямую вызывать исходные функции. Определив:

stash() {
    if [[ -z $1 ]]; then
        stash list;
    else
        git stash $1;
    fi;
}

Вы можете вызвать его просто с помощью stash или stash this , псевдоним не требуется.

1
18.11.2018, 08:18
3 ответа

Попробуйте использовать переключатель сокращения для исключения каталогов, это должно ответить на ваш вопрос:

find. -path./your-folder -prune -o -maxdepth 1 -type d -print
2
27.01.2020, 23:11

Нет другого способа узнать, какие имена являются целями символических ссылок, кроме как найти символические ссылки и перейти по ним.

Поэтому мы можем сделать это следующим образом (предполагается bashверсия 4.0 или более поздняя):

#!/bin/bash

# Our blacklist and whitelist associative arrays (whitelist is a misnomer, I know)
# blacklist: keyed on confirmed targets of symbolic links
# whitelist: keyed on filenames that are not symbolic links
#            nor (yet) confirmed targets of symbolic links

declare -A blacklist whitelist

for name in *; do
    if [ -L "$name" ]; then

        # this is a symbolic link, get its target, add it to blacklist
        target=$(readlink "$name")
        blacklist[$target]=1

        # flag target of link in whitelist if it's there
        whitelist[$target]=0

    elif [ -z "${blacklist[$name]}" ]; then
        # This is not a symbolic link, and it's not in the blacklist,
        # add it to the whitelist.
        whitelist[$name]=1
    fi
done

# whitelist now has keys that are filenames that are not symbolic
# links. If a value is zero, it's on the blacklist as a target of a
# symbolic link.  Print the keys that are associated with non-zeros.
for name in "${!whitelist[@]}"; do
    if [ "${whitelist[$name]}" -ne 0 ]; then
        printf '%s\n' "$name"
    fi
done

Предполагается, что сценарий запускается с вашим каталогом в качестве текущего рабочего каталога, и он не делает предположений об именах в этом каталоге.

4
27.01.2020, 23:11

Если вы хотите, чтобы все файлы типа каталог , которые не являются целью символической ссылки shortcut, сzsh:

#! /bin/zsh -
printf '%s\n' *(/^e'{[[ $REPLY -ef shortcut ]]}')
  • (...):квалификатор glob для дальнейшей фильтрации файлов на основе других критериев, а не только имени
  • /:только файлы типа директория
  • ^:отрицание следующих квалификаторов glob
  • e'{shell code}':выбрать файлы на основе результата (состояния выхода )оценки shell code(, где рассматриваемые файлы находятся в$REPLY)
  • [[ x -ef y ]]:возвращает true, если xи yуказывают на один и тот же файл (после разрешения символической ссылки ). Как правило, это делается путем сравнения устройства и номера инода обоих файлов (, полученных с помощью системного вызова stat(), разрешающего символические ссылки ).

Список GNUfind(не отсортирован, имена файлов имеют префикс./):

#! /bin/sh -
find -L. ! -name. -prune -xtype d ! -samefile shortcut
  • -L:для символических ссылок рассматривается цель символической ссылки. Это необходимо для того, чтобы -samefileделал то же самое, что и zshдля -efвыше.
  • ! -name. -prune:удалить любой файл, кроме .. То же, что и -mindepth 1 -maxdepth 1, но короче и стандартнее.
  • -xtype d:теперь, когда -Lвключен, нам нужно -xtype, чтобы соответствовать типу исходного файла перед разрешением символической ссылки:
  • -samefile shortcut:true, если файл совпадает сshortcut(после разрешения символической ссылки с помощью-L)

Вывести список всех каталогов, кроме тех, которые являются целью любых символических ссылок в текущих каталогах:

#! /bin/zsh -
zmodload zsh/stat
typeset -A ignore
for f (*(N@-/)) {
   zstat -H s -- $f &&
     ignore[$s[device]:$s[inode]]=1
}

printf '%s\n' *(/^e'{zstat -H s -- $REPLY && ((ignore[$s[device]:$s[inode]]))}')

Обратите внимание, что базыzsh-игнорируют скрытые файлы. Добавьте классификатор glob Dили установите параметр dotglob, чтобы учитывать их.

3
27.01.2020, 23:11

Теги

Похожие вопросы