поврежденные каталоги, проблема с их удалением

Я создал сценарий для рекурсивного поиска шаблона с помощью 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 ++ .

5
23.04.2017, 16:55
2 ответа

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 ?

11
27.01.2020, 20:32

Альтернативный метод легкого удаления каталогов и/или файлов, названных непечатными символами, состоит в том, чтобы узнать номер 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 для возврата только файлов.

4
27.01.2020, 20:32

Теги

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