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

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

ファイルのすべての行の末尾にファイル名を追加する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追加することを指摘した@thiagowfxに感謝します。./foo/file2.txt

./などを追加せずにファイル名のみを追加するには、このオプションを使用します。

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編集したいファイルを含むディレクトリに置き換えます。

関連情報