Существует большой поток об этом на форумах Ubuntu. Ole J предлагает следующую функцию определения завершения псевдонима:
function make-completion-wrapper () {
local function_name="$2"
local arg_count=$(($#-3))
local comp_function_name="$1"
shift 2
local function="
function $function_name {
((COMP_CWORD+=$arg_count))
COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
"$comp_function_name"
return 0
}"
eval "$function"
echo $function_name
echo "$function"
}
Используйте его для определения функции завершения для псевдонима, затем укажите что функция как completer для псевдонима:
make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst
Я предпочитаю использовать псевдонимы для добавления всегда используемых аргументов существующим программам. Например, с grep
, Я всегда хочу пропустить устройства и двоичные файлы, таким образом, я делаю псевдоним для grep
. Для добавления новых команд такой как grepbin
, Я использую сценарий оболочки в моем ~/bin
папка. Если та папка будет в Вашем пути, то она будет автоматически заполнена.
Вместо того, чтобы использовать комнату, может быть легче использовать, находят. Команда как это удалила бы все кроме файла, названного точно 'файл'
find . \! -name 'file' -delete
Много версий должны смочь поддерживать соответствие регулярного выражения и globbing.
Вы могли также передать вывод по каналу находки к комнате также
find . \! -name '*pattern*' -print0 | xargs --null rm
Используя zsh, с setopt EXTENDED_GLOB
, использование ~
оператор (кроме)
rm -- *~(x|y|z)
или ^
оператор (отрицание):
rm -- ^(x|y|z)
Но, необходимо, вероятно, вместо этого переместить файлы в другое место, затем удалить все. Это намного более безопасно с точки зрения промахов пальца, таково как удар, входят слишком скоро.
Более поздние версии удара имеют extglob
опция оболочки, которая дает Вам синтаксис для того, чтобы сделать то, что Вы хотите (проверяют Вашу страницу справочника при "Расширении Пути", чтобы видеть, имеет ли Ваша установленная версия его):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Для тестирования я предлагаю, чтобы Вы сначала заменили rm
с echo
видеть, является ли список файлов, которые будут удалены, тем, что Вы ожидаете.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Внимание: Выполните команду и если файлы, которые будут удалены, являются правильными, выполняют ее снова и удаляют символ хеша "#".
Если имена файлов более сложны затем, что, сделать
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Снова, сначала посмотрите на результаты, затем удаляют знак хеша.
Эта версия - как предложено в комментариях - сохраняет некоторые символы и выглядит немного более ясной.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
egrep
аргумент "^(file1|filename2|f1le)$"
– Michael Mrozek♦
12.02.2011, 00:37
a
, b
и a b
первая программа удалит - при помещении ab в grep часть: "^[ab]$"
a
и b
но нет a b
, просто настроенный против Ваших намерений. Вторая команда сделает то же. И третье также. Вы не должны использовать 'ls' в сценариях, с очень, очень редкие исключения. Просто не делайте этого.
– user unknown
12.03.2011, 04:17
Переместите файлы, которые Вы хотите держать отдельно. Поднимитесь один уровень, удалите папку. Воссоздайте папку и положите обратно те файлы.
/
, heh? Не очень практичный. c), Пытающийся удалить все файлы в Вашем $HOME
не действительно практично также.
– alex
12.03.2011, 08:48
С находкой GNU можно использовать - удаляют переключатель, который удаляет каталоги, если пустой, также:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
один путь состоит в том, чтобы работать вокруг этого.
– Gilles 'SO- stop being evil'
12.03.2011, 03:00
tmp
также, если было нет X
/Y
/Z
файлы в нем.Примечание: !
как стандартный эквивалент GNU -not
(-delete
также расширение GNU)
– Stéphane Chazelas
13.09.2017, 15:32
Будет удалено все (, включая скрытые ), за исключением выбранных файлов/папок в ТЕКУЩЕМ каталоге.
find. -maxdepth 1 ! -name "file1.php" ! -name "file2.js" ! -name "dir1" ! -name "dir2" ! -name. -exec rm -r {} \;
-delete
а также что файлы будут сохранены путем удаления-delete
и\!
. – Shawn J. Goff 11.02.2011, 02:51find
является рекурсивным! таким образом, все подкаталоги файлов, не соответствующие 'шаблону', будут удалены также – Alexandre Holden Daly 24.06.2014, 01:07