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

Примечание: cat file1 > file2 : не требуется, так как это записывает полные данные.

Требование: чтение некоторых данных и запись, снова чтение и запись.

while read -n1 ch
do
   
    cat $ch > $output   # Tried this, showing error. While writing the data after reading, cat command throws error : No such file or directory.
        
done < $filename
0
terdon 8 Июл 2021 в 16:30
Что такое ch? Это имя файла? Вы просто ищете printf '%s\n' "$ch" >> "$output"?
 – 
terdon
8 Июл 2021 в 16:31
2
Что вы подразумеваете под "бинарными данными"? Bash read предназначен для строкового текста. Он полностью пропускает символы NUL и возвращает пустую строку для новой строки независимо от значения IFS (хотя -N1 возвращает фактические новые строки). printf также не выводит NULL. Таким образом, ваш двоичный файл будет искажен. Кроме того, использование > file в цикле просто перезаписывает файл для каждого символа, а >> file открывает и закрывает файл для каждого символа. Используйте > file вне цикла (после done).
 – 
Paul_Pedant
8 Июл 2021 в 17:50

1 ответ

cat – это команда, используемая для объединения файлов в каталоги, а также для вывода содержимого одного файла на стандартный вывод. Все, что делает cat, это берет файл или что-то еще, что передается в его стандартный входной поток, и распечатывает его. Вы не печатаете свои аргументы, такие как echo или оператор print на других языках, это не то, для чего это нужно.

Таким образом, вы используете неправильный инструмент для работы здесь. Вам нужен echo, который выводит все, что вы ему даете, добавляя новую строку в конце (обычно и по умолчанию) или лучше и безопаснее, особенно для двоичных данных, printf:

while read -r -n1 ch
do
    printf '%s\n' "$ch" >> "$output"
done < "$filename"

Обратите внимание на -r, который говорит read не интерпретировать обратную косую черту как экранирование, использование >> вместо >, поскольку с > вы бы перезаписали $output на каждой итерации и будет видеть только последний прочитанный символ и использование кавычек вокруг ваших переменных, чтобы защитить их от split+ расширение glob оболочкой.

0
terdon 8 Июл 2021 в 16:49