Intereting Posts
Как я могу заставить bash освободить расширенную переменную скобки без имени? Объединение Awk с Curl Строка Shebang с `#! / Usr / bin / env command -argument` не работает в Linux Как конвертировать дату с «Oct 01 20:00» в формат «1 октября 20:00» (пробел)? Linux альтернатива истории файлов / теневые копии для внутренней резервной копии? Расположение и содержимое выходного файла на основе списка файлов Сигнализировать об окончании аргументов опции: двойные тире `–` против одинарной тире` -`? понимание значения по умолчанию IFS Права доступа к Linux vsftpd Один лайнер для включения некоторых SCL и виртуальной среды python? Монитор FullHD lcd читается как 1024×768 CRT, проблема с неправильным разрешением Использование Unison с colordiff Как включить новый репозиторий в CentOS? Могу ли я установить цвета терминала на локальном компьютере, чтобы использовать те, которые были в машине I ssh? Почему wget пропускает файлы при попытке зеркального отображения сайта

Как получить имена файлов при использовании find и sed

Я пишу сценарий, чтобы применить sed к определенным файлам, а затем перечислить файлы, которые были изменены, чтобы я знал, какие изменения были изменены.

Вот как я нахожу, а затем использую sed:

find . -type f -a \( -name "*.txt" -o -name "*.git"\) -a -exec sed -i -e "s/"str1"/"str2"/g" {} + 

Как распечатать имя файла измененных файлов? Я бы хотел напечатать его в отсортированном порядке, чтобы его было легче читать.

При использовании только sed мы можем это сделать:

 sed -i 's/$pattern/$new_pattern/w changelog.txt' $filename if [ -s changelog.txt ]; then # CHANGES MADE, DO SOME STUFF HERE else # NO CHANGES MADE, DO SOME OTHER STUFF HERE fi 

Но как мне это сделать при совместном использовании find и sed? Я проверил справочную страницу и попробовал кучу вещей, но ничего не получилось.

Должно быть достаточно легко написать небольшой скрипт, который делает то, что вы хотите, и выполнить скрипт в качестве аргумента для find . У вас уже есть скрипт, и если вы замените $filename на $1 , у вас есть это. Ваш скрипт будет иметь форму

 #!/bin/bash sed -i 's/$pattern/$new_pattern/' $1 echo $1 >> changelog 

Назовем этот скрипт ed_notify . Теперь вы можете запускать его на выбранных

 cat changelog >> changelog.old rm changelog find . -type f -a \( -name "*.txt" -o -name "*.git"\) -a -exec ed_notify {} \; 

Ваша команда sed (при правильном цитировании):

 sed 's/str1/str2/g' 

Это изменит все вхождения str1 в str2 . Список файлов, содержащих str1 может быть grep -l 'str1' из grep -l 'str1' :

 find . -type f \( -name '*.txt' -o -name '*.git \) \ -exec grep -l 'str1' {} \; \ -exec sed -i 's/str1/str2/g' {} + >changelist.txt 

В качестве альтернативы, можно find имена файлов, содержащих строку:

 find . -type f \( -name '*.txt' -o -name '*.git \) \ -exec grep -q 'str1' {} \; \ -print \ -exec sed -i 's/str1/str2/g' {} + >changelist.txt