Sed не мог редактировать :не обычный файл

Мой сын хочет использовать этот сканер под Debian. Я искал поддержку, и этот вопрос появился среди первых обращений, поэтому я делюсь своим опытом здесь.

На нескольких страницах также рекомендуется приведенная выше ссылка, однако SANE поддерживает сканер HP ScanJet 2400 напрямую через серверную часть Genesys . Вы можете проверить свою установку с помощью scanimage -Lи выполнить сканирование с помощью scanimage > test.pnmиз командной строки.

1
17.07.2019, 14:48
2 ответа

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

find -type f... #  Doesn't return directories
find -iname "*.txt"... #  returns only files ending in '.txt' (case insensitive)

Или, если вы действительно хотите пофантазировать, вы можете попробовать запускать sed только для файлов, которые действительно содержат строку, используя grep:

grep -l -r 'FCLP1025' | xargs sed -i 's/FCLP1025/FCLP1080/g'

Команда grep -rищет рекурсивно, и -lперечисляет только имена соответствующих файлов. Затем xargsиспользует стандартный ввод и добавляет его в качестве аргументов для следующей команды, которая аналогична {}при использовании find -exec cmd {} \;.

Тем не менее, протестировано в bash на linux, поэтому, если это не работает, вы можете увидеть grep --helpв git -bash/cygwin, если флаги разные. Хотя обычно они одинаковые.

3
27.01.2020, 23:30

Ваша команда может найти каталоги (и другие не -обычные файлы ). Каталоги — это не обычные файлы, которые вы можете редактировать с помощью sed.

Добавление теста -type fк команде findгарантирует, что вы обрабатываете только обычные файлы:

find. -type f -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

или, со стандартными опциями findи более читаемым цитированием,

find. -type f ! -path '*.hg*' -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

Если вы просто хотите полностью пропустить какой-либо каталог .hg, используйте -prune, чтобы удалить его из пути поискаfind:

find. -name.hg -prune -type f -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

Это заставляет findдаже не входить в каталоги с именем .hg. Ваша команда будет входить в такие каталоги и проверять все в них с помощью -path, что будет немного неэффективно.

Обратите внимание, что не будет вывода вашей команды find, так какsed -i(sedвыполнение в -редактировании места )никогда не приводит к выводу на терминал (, если нет диагностических сообщений ). Вывод sed -iпопадает в файлы, которые он редактирует.

Также обратите внимание, что последняя команда findвыше попытается отредактировать каждый файл. Если вы что-то знаете об именах файлов, которые хотите отредактировать,вы можете добавить -name 'some pattern'непосредственно перед -exec, чтобы ограничить запуск sedтолько этими файлами.

0
27.01.2020, 23:30

Теги

Похожие вопросы