#linux #sed #find
Вопрос:
У меня есть каталог, состоящий из 102 подкаталогов с 1590 файлами. Я попытался выполнить приведенную ниже команду рекурсивно для всех файлов, включая файлы с пробелами в имени, чтобы изменить список из 400 тегов с #tag
на [[link]].
find . -name '*.md' | xargs sed -i -f sedfile *.md
Он работает только для файлов, в именах которых нет пробелов. Файл sedfile отформатирован как s/#tag/[[link]]/g
sed: can't read ./4.Programming/G-Code/List: No such file or directory sed: can't read of: No such file or directory sed: can't read Common: No such file or directory sed: can't read G-Code: No such file or directory sed: can't read Commands: No such file or directory sed: can't read and: No such file or directory sed: can't read What: No such file or directory sed: can't read They: No such file or directory sed: can't read Mean.md: No such file or directory
Имя файла 4.Программирование/G-Код/Список распространенных команд G-кода и что они Mean.md.
Я ранее использовал
find . -type f -name "*.md" -print0 | xargs -0 sed -i '' -e 's/#tag/[[link]]/g'
чтобы внести изменения по отдельности, но я не собираюсь вручную изменять 390 больше.
Когда я пытаюсь объединить эти два
find . -name '*.md' print0 | xargs -0 sed -i -f sedfile *.md
Я получаю
find: paths must precede expression: `print0`
Статьи, которые я нашел до сих пор в своем исследовании, показывают, как внести несколько изменений в один файл или одно изменение в несколько файлов. Как я могу отредактировать любой из двух примеров, чтобы охватить файлы *.md в каталоге?
Ответ №1:
Есть опечатка: вы используете print0
вместо -print0
.
Вам также не нужно *.md
, потому xargs
что это предоставление имен файлов.
Это должно сработать:
find . -name '*.md' -print0 | xargs -0 sed -i -f sedfile
Вы также можете использовать -exec
вместо этого:
find . -name '*.md' -exec sed -i -f sedfile {}