Вы можете получить отчет о том, какие файлы отправлены в perl, используя -print
и -exec
:
find . -name "*.txt" -print -exec perl -pi -e 's/http//g' '{}' \;
Если вы хотите узнать, какие файлы были изменены, то что-то вроде
find . -name "*.txt" \
-exec perl -i.bak -pe 's/http//g' '{}' \; \
-exec sh -c 'cmp -s "$1" "$1.bak" && echo "$1" || rm "$1.bak"' _ '{}' \;
Обратите внимание, что sed
является S tream ED itor, а не редактором файла , поэтому люди склонны злоупотреблять им для пытаюсь редактировать файлы. В основном опция -i
- это нестандартные расширения FreeBSD (могут быть недоступны в других операционных системах), во-вторых, он не редактирует файлы - он делает копию и заменяет исходный файл копией. BashFAQ
Альтернативой является использование команды ed
или ex
(часть Vim) с аналогичным синтаксисом, например
ex +%s/cat/dog/e -scwq pet_link
Или в соответствии с рекомендацией @Wildcard :
printf '%s\n' '%s/cat/dog/' x | ex pet_link
Для нескольких файлов вы можете использовать:
ex "+bufdo! %s/foo/bar/ge" -scxa **/*.lnk
Если ваша оболочка поддерживает новую опцию подстановки (включить: ] shopt -s globstar
), используя **
в этом случае будет работать рекурсивно.
Чтобы узнать больше о синтаксисе POSIX , вы можете попробовать (согласно предложению @Wildcard ):
for f in *.txt; do printf '%s\n' '%s/cat/dog/g' x | ex "$f"; done
или:
find . -type f -exec sh -c 'for f; do printf "%s\n" "%s/cat/dog/g" x | ex "$f"; done' sh {} +
По теме:
Немного ed
:
$ ed pet_link <<END_OF_ED
g/cat/s//dog/
w
END_OF_ED
Жесткая ссылка не нарушается.