ファイルのすべての行の末尾にファイル名を追加する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
そしてperl
find
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
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
答え3
find
以下を試してみてくださいsed
。
find /path/to/top_directory -type f -execdir sed -i -e "s/$/ {}/" {} \;
/path/to/top_directory
編集したいファイルを含むディレクトリに置き換えます。