我想读取一个字符,然后是一个固定长度的字符串(该字符串在文件中不是空终止的,其长度由前面的字符给出)。
如何在 bash 脚本中执行此操作?如何定义字符串变量以便我可以对其进行一些后期处理?
我有一个 bash 函数,它将文件作为参数,验证文件是否存在,然后将来自 stdin 的任何内容写入文件。天真的解决方案适用于文本,但我遇到了任意二进制数据的问题。
echo -n '' >| "$file" #Truncate the file
while read lines
do # Is there a better way to do this? I would like one...
echo $lines >> "$file"
done
Run Code Online (Sandbox Code Playgroud) 除了dd应该使用哪些工具来读取和写入截断、查找和跳过的文件之外,还有哪些工具?dd的命令行选项看起来既不方便又陌生,我不喜欢在缓慢但精确的搜索模式 ( bs=1) 和快速但不灵活的模式(bs=4k或其他)之间进行选择。
是否有更现代的工具可以从一个文件(或管道、套接字或 dev)中的位置 31337 读取 555 个字节,并将它们写入另一个文件的位置 128205(使用块 512+43),无论是否截断?
我已经知道vim -b,但是,根据所使用的语言环境,它将多字节字符(如 UTF-8)显示为单个字母。
vim无论字符集如何,我如何要求只显示 ASCII 可打印字符,并将其余字符视为二进制数据?
这个问题之前问过我几次,现在是为了 回答在/sf/ask/69540411/ 中给出的Bash Answers 中的标准输入中循环二进制数据块的问题 -as-perl-is-to-text也不令人满意。
我正在寻找一种专门用于处理二进制文件 I/O 的脚本环境。我知道我可以使用一种成熟的编程语言(c/Python/...),但它们有巨大的初始化和编码开销(c 中的分配和 fread/fwrite,Python 中的位串......)更不用说它们不太适合编写脚本(从中调用其他应用程序)。Perl 的unpack功能、面向字符串的操作和愚蠢的语法也好不到哪里去。
类似于od,但作为一种语言。
我的期望:
read var用int32 var, float var等)。我想像检查 ASCII 文件一样轻松和深入地处理原始数据(摄影、科学数据、未知和记录不佳的格式)。我现在正在使用c,但它不是临时脚本的最佳选择,并且不能进行交互。
有人知道这样的工具吗?请不要使用可点击的 GUI 软件,它需要通过 ssh、其他脚本等工作。“不存在”是一个可以接受但令人沮丧的答案。
二进制文件有字符串和一些数字,如果我这样做
od -c filename或strings filename,我可以正确地看到字符串。但是,数字呢?它们采用某种奇怪的格式。
做完后的文字od -c filename是这样的:
0000000 036 \0 032 004 SD \0 \0 \0 \0 seq 1 0000020 \0 \0 \0 \0 \0 \0 \0 \0 \t \0 ó 002 3 001 0000040 & \0 032 \f O 2 006 \0 \0 \0 osfus 1 0000060 ó 002 3 001 ÿ \r \0 \0 \t \0 \0 @ 3 × 0000100 233 º 004 \0 é 003 \0 \0 & \0 032 …
我尝试在运行 NixOS 的 VM 上安装当前的 oracle jre。
现在发生以下情况:
[michas@cc:~]$ tar xvzf jre-7u40-linux-x64.tar.gz |grep bin/java
jre1.7.0_40/bin/javaws
jre1.7.0_40/bin/java_vm
jre1.7.0_40/bin/java
[michas@cc:~]$ ls -l ./jre1.7.0_40/bin/java
-rwxr-xr-x 1 michas nogroup 7750 Aug 27 09:17 ./jre1.7.0_40/bin/java
[michas@cc:~]$ ./jre1.7.0_40/bin/java
bash: ./jre1.7.0_40/bin/java: No such file or directory
Run Code Online (Sandbox Code Playgroud)
跆拳道?命名文件显然在那里。到底是怎么回事?
尝试进一步分析:
[michas@cc:~]$ strace ./jre1.7.0_40/bin/java
execve("./jre1.7.0_40/bin/java", ["./jre1.7.0_40/bin/java"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1) = ?
+++ …Run Code Online (Sandbox Code Playgroud) 在我使用以下命令后,
pngString="$(cat example.png)"
echo -n "$pngString" > tmp.png
Run Code Online (Sandbox Code Playgroud)
我无法将 tmp.png 作为 PNG 文件打开。当我$pngString用来存储图像文件时,可能会丢失一些信息。
所以问题是:如何在 bash 脚本中使用变量存储完整的图像信息?
我想获取有关二进制包的详细信息并在 linux 上运行它们。我正在运行 Debian 基础(Ubuntu/Linux mint)Linux 操作系统。
假设abc我的本地计算机上有一个 4 GB 的文件。我已通过 SFTP 将其上传到远程服务器,花了几个小时。
现在我在本地稍微修改了该文件(最大可能为 50 MB,但不是此文件中的连续字节),并将其保存到abc2. 我还将原始文件保存在abc本地计算机上。
如何计算的二进制差异abc和abc2?
应用:
我只能向patch远程服务器发送一个文件(可能最大 100MB),而不是重新上传整个abc2文件(又需要几个小时!),并且仅abc2在远程服务器上重新创建。abcpatch
在本地,与其浪费 8 GB 来备份abcand abc2,我只能保存abc+ patch,因此只需要 < 4100 MB。
这该怎么做?
PS:对于文本,我知道diff,但在这里我正在寻找适用于任何原始二进制格式的东西,它可以是 zip 文件或可执行文件,甚至其他类型的文件。
PS2:如果可能,我不想使用rsync;我知道它可以以有效的方式复制两台计算机之间的更改(不重新发送未更改的数据),但在这里我真的想要一个patch文件,如果我同时拥有abc和patch.