Найдите файл с подходящей строкой и выполните над ним действия UNIX - PullRequest
0 голосов
/ 30 января 2020

Part1: У меня есть папка «MyFolder» с несколькими подпапками, такими как «new», old »et c. Мне нужен код UNIX, который будет l oop через каждую папку и подпапку и создавать копию файлов "abc_MED.txt", которые не имеют "_MED.txt" Например: ab c .txt -> abc_MED.txt -> abc_MED.txt Не следует добавлять каждый раз abc_MED_MED.txt XX

Часть 2. Для всех файлов с «_MED.txt» следует добавить «_2» в конце первой строки файл.

Любая помощь будет оценена.

Я пробовал это:

for file in *.txt
do
if [[  ! -f ${file%*}_MED.txt ]]
then
     cp $file ${file%.*}_MED.txt
fi
done

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Это мое bash решение

find . -type f -not -name "*_MED*" -exec sed -i '1{s/$/_2/}' {} +

Объяснение:
Найти все файлы (-f), которые (-не) не соответствуют (-name) шаблон " _MED ", для каждого из них выполните команду sed sed -i '1 {s / $ / _ 2 /}', которая добавляет _2 в конец строки, только один раз

найти . -type f -not -name " _MED " -exe c sed -i '' '1i \' $ '\ n' '_ 2' {} +

РЕДАКТИРОВАТЬ
Поскольку вы работаете на машине ma c (я этого не знал), команда sed немного отличается, попробуйте эту команду

find . -type f -not -name "*_MED*" -exec sed -i '' '1s/$/  _2/' {} \;
0 голосов
/ 30 января 2020

С помощью find, создание команды с параметром -printf, а затем выполнение с конвейером для bash:

find MyFolder/ -mindepth 1 -type f -not -name '*_MED.txt' -printf 'echo mv %p $(echo %p| sed 's/.txt/_MED.txt/g')\n' | bash | bash

Вторая часть, добавление содержимого

find MyFolder/ -mindepth 1 -type f -not -name '*_MED.txt' -exec sed -E -i '/$/ a "_2"' {} +

0 голосов
/ 30 января 2020

Попробуйте следующую команду, она будет искать файлы, игнорирующие *_MED.txt

find . -type f \( -iname "*.txt" ! -iname "*_MED.txt" \)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...