
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
上記の解決策によりファイル名に、./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
をロードしようとしますが、そこに誰かがマルウェアを仕掛けている可能性があります。で提供される拡張機能のパスはシステムによって異なる場合があります。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
編集したいファイルがあるディレクトリに置き換えます。