Я создал сценарий для рекурсивного поиска шаблона с помощью grep, а затем я могу выбрать один из совпадает, поэтому vim откроет этот файл в этой строке. Я называю его vgrep
(vim grep, хотя в нем также используется awk
). Вот его код:
#!/bin/bash
my_grep() {
grep -Rn -I --color=auto --exclude-dir={.svn,.git} --exclude={tags,cscope.out} "$@" . 2>/dev/null
}
my_grep_color() {
grep -Rn -I --color=always --exclude-dir={.svn,.git} --exclude={tags,cscope.out} "$@" . 2>/dev/null
}
awk '{
print NR, $0
}' <(my_grep_color "$@")
awk '{
lines[NR]=$1;
}
END{
printf "Enter index: "
getline num < "-";
split(lines[num], s, ":")
system("vim "s[1]" +"s[2])
}' <(my_grep "$@")
Я дважды вызываю grep
, чтобы выделить мои совпадения, вы можете изменить его, чтобы он вызывался только один раз, но вы потеряете выделение.
Использование:
Предположим, вы хотите открыть vim в строке, где есть слово «Foo», вы можете использовать его так: vgrep Foo
Если есть файл foobar, например:
a b c
Bar
e f Foo g
h i
vgrep
выведет это:
1 ./foobar:3 e f Foo g
Enter index:
Итак, вы можете ввести 1
+ введите
, и он откроет этот файл в третьей строке. Он будет выводить по одной индексированной строке для каждого найденного совпадения.
Я почти уверен, что этот сценарий можно улучшить, но для меня он отлично работает.
Также рассмотрите возможность использования ctags и cscope , если вы работаете с C / C ++
.
ls
напечатает символы, отличные от ASCII (или, скорее, символы, не поддерживаемые в текущей локали) как ?
. Это одна из причин, почему синтаксический анализ вывода ls
- это плохо. Вывод ls
предназначен для просмотра . В некоторых случаях, подобных этому, это не настоящие имена, существующие в файловой системе.
Попробуйте вместо этого что-нибудь вроде (они удалят все файлы и каталоги, включая / путь / к / каталогу
)
rm -rf /path/to/dir
или
find /path/to/dir -delete
или
find /path/to/dir -exec rm -rf {} +
или
find /path/to/dir -print0 | xargs -0 rm -rf
Измените под свои нужды.Чтобы удалить только файлы, добавьте, например, -тип f
после пути в примерах find
.
Выполнение только rm -rf *
внутри этого каталога (это важно , текущий рабочий каталог должен быть каталогом, файлы и каталоги которого вы хотите удалить) также может быть достаточным.
См. Также Почему не parse ls
?
Альтернативный метод легкого удаления каталогов и/или файлов, названных непечатными символами, состоит в том, чтобы узнать номер inode ошибочного каталога (или файла) и, используя его, удалить каталог (или файл):
cd /mypath || exit 1
ls -il #...to show the inode <number> in the leftmost column output
find . -xdev -inum <number> -exec rm -rf {} +
Опция -xdev
гарантирует, что find
не спустится в каталоги на других файловых системах. Номера Inode гарантированно уникальны только в пределах файловой системы.
Добавьте '-f' в качестве дополнительной опции find
для возврата только файлов.