有没有一个 Linux 命令可以只删除每个文件的第一个字符?

有没有一个 Linux 命令可以只删除每个文件的第一个字符?

有没有一个Linux命令可以删除文件夹中每个文件的第一行第一个字符,然后保存?

许多在线资源都涵盖对文件名的每一行而不是第一行执行此操作,否则它们不会保存文件。我尝试修改其中一个命令来执行我想要的操作,但它实际上使文件变成空白。

答案1

要删除当前工作目录中或当前工作目录下的每个非空常规文件的第一个字符,在 shell 中zsh,您可以执行以下操作:

zmodload zsh/mapfile
for file (**/*(ND.L+0)) mapfile[$file]=${mapfile[$file]#?}

请注意,它并不完全相同删除第一行的第一个字符在第一行为空的特殊情况下(文件以换行符开头)。在这种情况下,上面的内容会删除换行符,这意味着第一行(空)被删除。如果您不想这样做,可以将?(匹配任何字符) 替换为[^$'\n']匹配除换行符之外的任何字符。

请注意,由于这最终会将整个文件加载到内存中,因此您不希望在非常大的文件上执行此操作。

一种更内存友好的方法,但仍然会重写原始文件并保留其所有元数据(而不是用sed -i修改后的副本替换文件)可能是:

find . -name '*.jpg' -size +0 -exec ksh93 -c '
  builtin cat
  for file do
    { IFS= read -rN1 && cat; } < "$file" 1<>; "$file"
  done' ksh93 {} +

这次我们使用ksh93's<>;重定向运算符,以读+写模式打开文件(最初不截断),并且仅在重定向命令成功时才在退出时截断它。这里,命令是一个命令组,读取来自 stdin 的字符并丢弃它,然后将其 stdin 的其余部分写入 stdout。

请注意,如果文件名的其余部分可以解码为当前语言环境中的字符,则GNU find(与 相反zsh)将找不到名称以 结尾的文件。.jpg


或那些以无法解码为区域设置字符编码中的字符的内容开头的文件的第一个字节。与sed '1s/.//'哪个比较将删除可以解码的第一个字符,因此不一定在文件的开头,或者sed '1s/^.//'如果有的话,哪个将删除第一行开头的第一个字符,但除此之外不执行任何操作

答案2

如果你有GNU sed

find PATH -type f -exec sed -s -i '1s/.//' \{} +

答案3

您可以从包含文件的文件夹中的 awk 循环开始,然后立即将输出字符串重定向到原始文件。可用于删除前 n 个字符的 awk 命令如下所示:

awk '{print substr($1,2) > "/output/file" }' /path/to/file

请记住,在您读取的同一个文件上进行写入并不是最佳做法,但它确实有效。

相关内容