web-dev-qa-db-ja.com

Linuxで複数のファイルの末尾にテキストを追加する

ディレクトリとそのサブディレクトリ内のすべてのphpファイルの最後に次のコードを追加する必要があります。

</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">
<img src="ajax-loader.gif"/>
</div>

私は試しました

echo "my text" >> *.php

しかし、ターミナルはエラーを示しました:

bash : *.php: ambiguous redirect

私は何をすべきか。このコードセグメントを追加するには何百ものファイルがあり、各ファイルに追加するのは非常に困難です。前もって感謝します。

26
Harikrishnan

シェルを指定しないで、foreachコマンドを試すことができます。 tcsh(および、bashで非常に類似したバージョンが利用可能であると確信しています)の下で、インタラクティブに次のように言うことができます。

foreach i (*.php)
foreach> echo "my text" >> $i
foreach> end

$iは、ループを通過するたびに各ファイルの名前を引き継ぎます。

いつものように、多数のファイルを操作するときは、サンプルファイルを使用して小さなディレクトリでテストし、期待どおりに動作することを確認することをお勧めします。

エラーメッセージの.. bash(質問にタグを付けます)。同等のループは

for i in *.php
do 
   echo "my text" >> $i
done

現在のディレクトリの下にある複数のディレクトリをカバーする場合は、指定できます

*/*.php

のではなく *.php

13
Levon

少しきれいに見え、一般的に1行に収まると思うので、私は通常Tシャツを使用します。

echo "my text" | tee -a *.php
78
Dantastic

BashFAQ/056 は、あなたが試みたことがうまくいかない理由を説明するというまともな仕事をします。ご覧ください。

(エラーに応じて)bashを使用しているため、forコマンドは友達です。

for filename in *.php; do
  echo "text" >> "$filename"
done

ファイルから「テキスト」を取得したい場合は、代わりにこれを行うことができます:

for filename in *.php; do
  cat /path/to/sourcefile >> "$filename"
done

さて...あなたはmightサブディレクトリにファイルがあるでしょう。その場合、findコマンドを使用してそれらを見つけて処理できます。

find . -name "*.php" -type f -exec sh -c "cat /path/to/sourcefile >> {}" \;

findコマンドは、-name-typeなどの条件を使用してどのファイルを識別するかを示し、-execコマンドは、前の「for」ループで示したものと基本的に同じ動作をします。最後の\;は、これが-execオプションの引数の終わりであることをfindに示します。

man findで詳細を確認できます。

findコマンドは移植性があり、特にソリューションを他のシステムに移植したい場合は、この種のアクティビティに一般的に推奨されます。ただし、現在bashを使用しているため、bashのglobstarオプションを使用してサブディレクトリを処理することもできます。

shopt -s globstar
for filename in **/*.php; do
  cat /path/to/sourcefile >> "$filename"
done

この詳細については、man bashを検索して「globstar」を検索してください。このオプションには、bashバージョン4以降が必要です。

[〜#〜] note [〜#〜]:あなたがしていることに他の問題があるかもしれません。 PHPスクリプトは?>で終わる必要がないneedではないので、スクリプトはPHP code。

14
ghoti

sedfindを組み合わせて使用​​できます。あなたのプロジェクトツリーは

    /MyProject/ 
    /MyProject/Page1/file.php
    /MyProject/Page2/file.php
    etc.        
  1. 追加するコードを/MyProject/に保存します。 append.txtと呼びます
  2. /MyProject/から実行:

    find . -name "*.php" -print | xargs sed -i '$r append.txt'
    

    説明する:

    • findはそのまま実行し、サブディレクトリを含むすべての.phpを探します
    • xargsは、渡された(つまり実行されます)sedは、見つかったばかりのすべての.phpに対して
    • sedが追加を行います。 「$ r append.txt」は、ファイルの末尾($)に移動し、append.txtにあるものをすべて書き込む(貼り付ける)ことを意味します。 -iを忘れないでください。さもないと、追加されたファイルが印刷され、保存されません。

ソース: http://www.grymoire.com/unix/Sed.html#uh-37

3
Duc Pham

あなたはすることができます(ファイルパスにスペースがあっても動作します):

#!/bin/bash

# Create a tempory file named /tmp/end_of_my_php.txt
cat << EOF > /tmp/end_of_my_php.txt
</div>
<div id="preloader" style="display:none;position: absolute;top: 90px;margin-left: 265px;">
<img src="ajax-loader.gif"/>
</div>
EOF

find . -type f -name "*.php" | while read the_file
do
    echo "Processing $the_file"
    #cp "$the_file" "${the_file}.bak" # Uncomment if you want to save a backup of your file
    cat /tmp/end_of_my_php.txt >> "$the_file"
done

echo
echo done

PS:参照したいディレクトリからスクリプトを実行する必要があります

1
Elfoiros