すべてのサブディレクトリ内のすべてのファイルの各行の末尾にファイル名を追加する方法

すべてのサブディレクトリ内のすべてのファイルの各行の末尾にファイル名を追加する方法

bash スクリプト (ubuntu 16) に行を追加して、ファイル内のすべての行の末尾にファイル名を追加します。つまり、フォルダー内のすべてのファイルとすべてのサブフォルダー内のすべてのファイルです。

ファイル名は英数字と -_ などの特殊文字で構成されます。

例えば:

ファイル内のfilename_ghrut.txt前の行:

blah blah blah
blahblah blahblah

ファイル内のfilename_ghrut.txt次の行:

blah blah blah filename_ghrut.txt
blahblah blahblah filename_ghrut.txt

いろいろ調べてみましたが、ほとんどのコマンドが機能しないようです。

特定のディレクトリのすべてのサブフォルダー内のすべてのファイルに対してこれを実行したいと思います。

本当にありがとう。

これを見つけたのですが、うまく機能しません:

ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %

答え1

perlfind

find . -type f -exec perl -i -pe 's/$/ $ARGV/' {} +
  • s/$/ $ARGV/各行の末尾にスペースとファイル名を追加します
  • -iインプレース編集の場合、i.bkp元のファイルのバックアップを保持する場合に使用します。
  • findがサポートされていない場合は+\;代わりにを使用してください。
  • find . -type f現在のディレクトリにあるすべてのファイルのリストを表示します
  • -execコマンドを使用して、すべてのファイルに対して操作を行うことができます
  • find . -type f -name '*.txt'で終わるファイルのみに制限したい場合に使用します。.txt


./file.txt上記の解決策によりファイル名に、./foo/file2.txtなどが 追加されることを指摘してくれた @thiagowfx に感謝します。

./ファイル名のみを追加したい場合はこれを使用します。

find . -type f -exec perl -i -pe 's/$/$ARGV=~s|.*\/| |r/e' {} +
  • $ARGV=~s|.*\/| |rまでのすべての文字を/削除したファイル名が付けられます

答え2

GNUの場合awk:

LC_ALL=C find . -type f -exec gawk -i /usr/share/awk/inplace.awk '
  BEGINFILE {suffix = FILENAME; sub(/.*\//, "", suffix)}
  {print $0, suffix}' {} +

同じファイルのハード リンクが複数ある場合は、それぞれの名前が (順不同で) そのファイルの各行に追加されることに注意してください。

いかなる場合でも、使ってはいけません-i inplaceは、まず現在の作業ディレクトリから拡張機能(または)gawkをロードしようとしますが、そこに誰かがマルウェアを仕掛けている可能性があります。で提供される拡張機能のパスはシステムによって異なる場合があります。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答え3

findと を使用してこれを試してくださいsed:

find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;

/path/to/top_directory編集したいファイルがあるディレクトリに置き換えます。

関連情報