Вы можете добавить в свою среду список необходимых функций.
Создайте файл ~ / .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
, псевдоним не требуется.
Попробуйте использовать переключатель сокращения для исключения каталогов, это должно ответить на ваш вопрос:
find. -path./your-folder -prune -o -maxdepth 1 -type d -print
Нет другого способа узнать, какие имена являются целями символических ссылок, кроме как найти символические ссылки и перейти по ним.
Поэтому мы можем сделать это следующим образом (предполагается 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
Предполагается, что сценарий запускается с вашим каталогом в качестве текущего рабочего каталога, и он не делает предположений об именах в этом каталоге.
Если вы хотите, чтобы все файлы типа каталог , которые не являются целью символической ссылки 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
, чтобы учитывать их.