Использование bash: как найти способ поиска по всем вашим файлам в каталоге (рекурсивно?) - PullRequest
0 голосов
/ 05 января 2012

Мне нужна команда, которая поможет мне выполнить то, что я пытаюсь сделать.В данный момент я ищу все файлы «.html» в данном каталоге и вижу, в каких из них содержится строка «jacketprice».

Есть ли способ сделать это?А также для второй (но отдельной) команды мне понадобится способ заменить каждый экземпляр "jacketprice" на "coatprice", все в одной команде или сценарии.Если это возможно, не стесняйтесь, дайте мне знать.Спасибо

Ответы [ 4 ]

3 голосов
/ 05 января 2012

Что касается второго вопроса,

find . -name "*.html" -exec sed -i "s/jacketprice/coatprice/g" {} \;
3 голосов
/ 05 января 2012

Используйте рекурсивный grep для поиска по вашим файлам:

grep -r --include="*.html" jacketprice /my/dir

В качестве альтернативы включите в Globstar функцию bash (если вы этого еще не сделали), которая позволяет использовать **/ для сопоставления каталогов и вложенных файлов.каталоги.

$ shopt -s globstar 
$ cd /my/dir
$ grep jacketprice **/*.html
$ sed -i 's/jacketprice/coatprice/g' **/*.html
3 голосов
/ 05 января 2012
find . -name "*.html" -exec grep -l jacketprice {} \;

for i in `find . -name "*.html"`
do
  sed -i "s/jacketprice/coatprice/g" $i
done
1 голос
/ 05 января 2012

В зависимости от того, хотите ли вы это рекурсивно или нет, Perl будет хорошим вариантом:

Найти, не рекурсивно:

perl -nwe 'print "Found $_ in file $ARGV\n" if /jacketprice/' *.html

Будет печатать строкугде найдено совпадение, за которым следует имя файла.Может быть немного многословным.

Заменить, не рекурсивно:

perl -pi.bak -we 's/jacketprice/coatprice/g' *.html

Будет хранить оригинал с прикрепленным расширением .bak.

Найти, рекурсивно:

perl -MFile::Find -nwE '
    BEGIN { find(sub { /\.html$/i && push @ARGV, $File::Find::name }, '/dir'); };
    say $ARGV if /jacketprice/'

Будет напечатано имя файла для каждого совпадения.Несколько менее многословным может быть:

perl -MFile::Find -nwE '
    BEGIN { find(sub { /\.html$/i && push @ARGV, $File::Find::name }, '/dir'); };
    $found{$ARGV}++ if /jacketprice/; END { say for keys %found }'

Заменить рекурсивно:

perl -MFile::Find -pi.bak -we '
    BEGIN { find(sub { /\.html$/i && push @ARGV, $File::Find::name }, '/dir'); };
    s/jacketprice/coatprice/g'

Примечание: Во всех рекурсивных версиях /dirкаталог нижнего уровня, который вы хотите найти.Кроме того, если ваша версия perl меньше 5.10, say можно заменить на print с последующим переводом строки, например, print "$_\n" for keys %found.

...