LINUX.ORG.RU
ФорумAdmin

Извлечь текст из файлов

 ,


1

2

Добрый день!

Обращаюсь к гуру Баша.

Есть каталог с файлами (сайт). В нём большое количество подкаталогов. В каких-то из них, на неизвестной глубине, находится каталог «lang», в которой есть каталоги «en», «ru» и т.д.

Как бы пройтись по всем каталогам и извлечь содержимое файлов в каталоге «ru», с указанием имени файла.

А то чёрт ногу сломит, куда текст писать. Сейчас через Grep ищу нужную фразу, но хотелось бы видеть, где они все находятся.


_dir=$(find . -type d |grep 'lang/ru')

( find $_dir |\
  sed 1d |\
  while read line; do
   hr="-----------"
   printf "%s\n" $hr
   printf "filename: %s\n" `basename $line`
   printf "%s\n" $hr
   cat $line
) > all_files.txt
mystery ★★
()
Последнее исправление: mystery (всего исправлений: 3)
Ответ на: комментарий от mycop
#!/bin/bash
_dir=$(find . -type d |grep 'lang/ru')
hr="-----------"
( find $_dir | sed 1d | while read line; do
  echo $hr
  echo "__filename: `basename $line`__"
  cat $line
  echo $hr
  done
) > all_files.txt


Вот, что то я совсем bash подзабыл

mystery ★★
()
Последнее исправление: mystery (всего исправлений: 1)
Ответ на: комментарий от shell-script

template.php cat: template.php: No such file or directory

Почти работает, только не полный путь к каталогу использует.

mycop
() автор топика
Ответ на: комментарий от mystery

Заработало!

(b\\/bash только поправил)

----------- filename: template.php ----------- <? $MESS[«CT_BNL_ELEMENT_DELETE_CONFIRM»] = «Будет удалена вся информация, связанная с этой записью. Продолжить?»; ?>-----------

А как бы вместо filename: template.php полный путь показать?

mycop
() автор топика
Ответ на: комментарий от mystery

То , что надо!

Ещё раз всем спасибо!

mycop
() автор топика
Ответ на: комментарий от bl

Жрет кучу памяти на глубоких директориях и работает медленнее find, но компактно и радует тех кто меряется экономией «букав»

most-fucktum
()
Ответ на: комментарий от most-fucktum

У меня такой однострочный шедевр нарисовался

find $STARTDIR -type d -name lang -print0                      | \
  xargs  -r0 -I{} find {} -maxdepth 1 -type d -name ru -print0 | \
  xargs  -r0 -I{} find {} -maxdepth 1 -type f -print0          | \
  xargs -tr0 -I{} cat  {}
most-fucktum
()
Последнее исправление: most-fucktum (всего исправлений: 2)
Ответ на: комментарий от most-fucktum

Тоже работает!

P.S. Пошёл учить баш.

mycop
() автор топика
Ответ на: комментарий от mycop

Писал сразу сюда, не проверяя. Забыл путь указать.

Мог бы и сам поправить. )

DIR=$(find ./ -type d -name ru)

for file in $(ls $DIR)
do
  echo $file
  cat $DIR/$file
done
shell-script ★★★★★
()
Ответ на: комментарий от salsa

Для «используется каждый день по несколько раз» есть алиасы и updatedb / locate

# опционально, если запускается по cron'у и 
# если lang/ru не меняется часто

alias updateru='sudo updatedb' 

# тут визуально уродство из-за двойного раскрытия '/"
# но не дергает диск в поисках директорий/файлов

# /usr/share/ заменить на базовую директорию

alias showru='locate -r "/usr/share/.*/lang/ru/" | sh -c "while read file; do [ -f \$file ] && echo \"_____ \$file _____\" && cat -v \$file; done"'
most-fucktum
()
Последнее исправление: most-fucktum (всего исправлений: 3)
Ответ на: комментарий от most-fucktum

locate

для гигантских объемов, для часто обновляемых не подходит

глоббинг «ествественнее», т.к. большинство утилит ожидают список файлов в качестве аргументов, которые глоббингом формируются «на месте», что пригождается в т.ч. из других интерактивных программ, less/vim/vifm, например.

salsa
()
Последнее исправление: salsa (всего исправлений: 1)
Ответ на: комментарий от salsa

для часто обновляемых не подходит

я об этом написал

как твой глоббинг справится с «гигантских объемов», памяти и быстродействия bash'a хватит? Попробуй, на несколько порядков медленнее find

most-fucktum
()
Ответ на: комментарий от salsa

updatedb/locate можно натравить только на проект, а не на всю FS

EXAMPLES
  To create a private mlocate database as an user other than root, run
     updatedb -l 0 -o db_file -U source_directory

most-fucktum
()
Ответ на: комментарий от most-fucktum

тем не менее, эту БД нужно постоянно обновлять. если производительность глоббинга устраивает, то зачем париться?

salsa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.