Как я могу извлечь, в Linux, файлы, которые содержат имя другого файла внутри них - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть каталог (/mydir/cdl) с файлами с расширением cdl, например, ADDDAY0.cdl, ADDDAY1.cdl. Я хотел бы искать в наборе файлов, содержащихся в другом каталоге (/otherdir/exe/), который из них содержит имя файла .cdl в виде строки, например. ADDDAY0.cdl.

Я использовал этот скрипт:

for fullfile in /mydir/cdl/*.cdl; do
   file_no_path=${fullfile##*/}
    base_name=${file_no_path%%.*}
    grep -H -orw '/otherdir/exe/' -e "runexe $base_name"
done

и получил следующий вывод:

/otherdir/exe/ABDIRIDL:runexe ABDIRIDL
/otherdir/exe/ABIDISRI:runexe ABIDISRI
/otherdir/exe/PGAB01:runexe ADDDAY0
/otherdir/exe/PGAB01:runexe ADDDAY1
/otherdir/exe/PGAB01:runexe ADDDAY2
/otherdir/exe/PGAB01:runexe ADDDAYC1

Как удалить путь к файлу и строка runexe и имеют в качестве вывода:

ABDIRIDL   ABDIRIDL
ABIDISRI   ABIDISRI
PGAB01     ADDDAY0
PGAB01     ADDDAY1
PGAB01     ADDDAY2
PGAB01     ADDDAYC1

1 Ответ

2 голосов
/ 07 апреля 2020

Чтобы изменить вывод, вы можете передать его через sed. Добавьте следующий код после done

| sed -e 's#.*/##' -e 's/:runexe /\t/'

Вместо использования al oop для поиска каждого отдельного файла вы можете создать временный файл, содержащий все имена файлов с добавлением runexe и использовать один grep.

for fullfile in /mydir/cdl/*.cdl; do
   file_no_path="${fullfile##*/}"
    base_name="${file_no_path%%.*}"
   echo "runexe $base_name"
done > /tmp/patterns
grep -H -orw '/otherdir/exe/' -f /tmp/patterns.txt | sed -e 's#.*/##' -e 's/:runexe /\t/'
rm /tmp/patterns

или лучше

find /mydir/cdl -maxdepth 1 -name '*.cdl' | sed 's#.*/\([^.]*\)\..*#runexe \1#' > /tmp/patterns
grep -H -orw '/otherdir/exe/' -f /tmp/patterns.txt | sed -e 's#.*/##' -e 's/:runexe /\t/'
rm /tmp/patterns

Примечание. В примере кода не проверяются ошибки, связанные с временным файлом. Код может не работать должным образом, если у вас есть имена файлов со специальными символами.

...