Поиск в структуре каталогов с использованием find, sed и awk - PullRequest
0 голосов
/ 07 мая 2018

Эта серия команд редактирует idea.js и экспортирует ее как idea.csv ;

sed -n '/^get\.idea/s/^.*(\(.*\)).*/\1/ p' idea.js | 
awk -F, 'BEGIN {print "idea, description";OFS=","} (NR % 2 ) == 1
         {save=$2} (NR % 2) == 0 {print save, $2}' > idea.csv

И что мне нужно сделать, это запустить точно такие же команды, но используя find для поиска в нескольких файлах с одинаковым именем idea.js , которые находятся в нескольких каталогах, экспортируя каждый из этих файлов в тот же каталог, в котором был найден idea.js .

Я пытался разными способами, но получаю разные ошибки.

Здесь результат не соответствует ожидаемому:

find . -type f -name "idea.js" \( \ 
    -exec sed -n '/^get\.idea/s/^.*(\(.*\)).*/\1/ p' idea.js  {} \; -o \
    -exec true \; \) \
    -exec awk -F, 'BEGIN {print "idea, description";OFS=","} (NR % 2 ) == 1 
                   {save=$2} (NR % 2) == 0 {print save, $2}' > idea.csv {} \;

А здесь:

find . -type f -name "idea.js" \( 
    -exec sed -n '/^get\.idea/s/^.*(\(.*\)).*/\1/ p' idea.js | 
    awk -F, 'BEGIN {print "idea, description";OFS=","} (NR % 2 ) == 1
            {save=$2} (NR % 2) ==0 {print save, $2}' > idea.csv {} \) 

Я получаю эту ошибку:

    idea, description
awk: cannot open {} (No such file or directory)
find: missing argument to `-exec'
Try 'find --help' for more information.

Я хотел бы узнать, как сделать это непосредственно из командной строки и как скрипт, который будет выполняться следующим образом:

$ sh script.sh

Я ценю помощь.

1 Ответ

0 голосов
/ 10 мая 2018
find . -type f -name idea.js -exec sh -c '
    for idea do
        sed -n "/^get\.idea/s/^.*(\(.*\)).*/\1/ p" "$idea" | 
        awk -F, "BEGIN {print \"idea, description\";OFS=\",\"} (NR % 2 ) == 1
                 {save=\$2} (NR % 2) == 0 {print save, \$2}" >"${idea%.js}.csv"
    done' sh {} +

Это делает ваш фрагмент кода оболочки более или менее неизменным (за исключением того, что я организовал так, что одиночная кавычка в коде теперь является двойной кавычкой, а выходное имя файла вычисляется из входного имени файла путем замены расширения), и выполняет его через find. find предоставит коду список путей к файлам idea.js, и код будет зацикливаться на них.

Альтернативой может быть помещение вашего кода в сценарий оболочки:

#!/bin/sh

for idea do
    sed -n '/^get\.idea/s/^.*(\(.*\)).*/\1/ p' "$idea" | 
    awk -F, 'BEGIN {print "idea, description";OFS=","} (NR % 2 ) == 1
             {save=$2} (NR % 2) == 0 {print save, $2}' > "${idea%.js}.cvs"
done

и затем вызовите этот сценарий для всех найденных путей:

find . -type f -name idea.js -exec ./script.sh {} +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...