各ファイルの最初の文字だけを削除するLinuxコマンドはありますか?

各ファイルの最初の文字だけを削除するLinuxコマンドはありますか?

フォルダ内のすべてのファイルの最初の行の最初の文字を削除してから保存できるLinuxコマンドはありますか?

多くのオンラインリソースは、最初の行ではなくファイル名のすべての行に対してこれを行います。それ以外の場合、ファイルは保存されません。必要に応じてコマンドの1つを変更しようとしましたが、実際にはファイルが空でした。

答え1

現在の作業ディレクトリ内または下にある空でないすべての一般ファイルの最初の文字を削除するには、シェルで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<>;リダイレクト演算子を使用して読み書きモードでファイルを開き(最初は切り捨てることなく)、リダイレクトコマンドが成功した場合にのみ終了時にファイルを切り捨てます。ここで command はコマンドグループです。一つ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 ループで開始し、出力文字列を元のファイルに即座にリダイレクトできます。最初の文字を削除するために使用できるawkコマンドは次のとおりです。

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

読んだのと同じファイルに書き込むのは最善の方法ではありませんが、うまくいくことに注意してください。

関連情報