2012-06-02 17 views
17

tôi cần phải thêm đoạn mã sau vào cuối cùng để tất cả các file php trong một thư mục và thư mục con của nó:Nối một văn bản ở cuối của nhiều file trong Linux

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

Tôi đã thử với

echo "my text" >> *.php 

Nhưng thiết bị đầu cuối cho thấy lỗi:

bash : *.php: ambiguous redirect 

tôi nên làm gì. có hàng trăm tệp để thêm phân đoạn mã này và nó sẽ là một thời gian khó khăn thực sự khi thêm nó vào mỗi tệp. Cảm ơn trước.

Trả lời

10

Bạn không chỉ định trình bao, bạn có thể thử lệnh foreach. Dưới tcsh (và tôi chắc chắn rằng một phiên bản rất giống nhau có sẵn cho bash), bạn có thể nói cái gì đó như một cách tương tác:

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

$i sẽ mất vào tên của mỗi tập tin mỗi lần thông qua các vòng lặp. Như mọi khi, khi thực hiện các thao tác trên một số lượng lớn tệp, có thể bạn nên kiểm tra chúng trong một thư mục nhỏ với các tệp mẫu để đảm bảo nó hoạt động như mong đợi.

Rất tiếc .. bash trong thông báo lỗi (Tôi sẽ gắn thẻ câu hỏi của bạn với nó). Vòng lặp tương đương sẽ là

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

Nếu bạn muốn bao gồm nhiều thư mục dưới một bạn đang ở đâu bạn có thể chỉ định

*/*.php 

hơn *.php

+0

gì về các tập tin trong thư mục con? Tôi cũng cần phải phụ thêm vào nó. PS: Tôi đã sử dụng lệnh 'cho tôi bằng $ a làm echo" mã ">> $ i done' Nhưng trong tất cả các tệp, nó nối hai lần và không có gì xảy ra với các tệp trong thư mục con. –

+3

Lệnh "tìm" tốt hơn cho các thư mục con. – Graham

+0

Đối với các ví dụ bash quote '$ i' để xử lý các tập tin với không gian trong chúng cho –

9

BashFAQ/056 làm một công việc đàng hoàng giải thích lý do tại sao những gì bạn đã thử không hoạt động. Có một cái nhìn.

Vì bạn đang sử dụng bash (theo lỗi của bạn), lệnh for là bạn của bạn.

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

Nếu bạn muốn kéo "text" từ một tập tin, bạn thay vì có thể làm điều này:

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

Bây giờ ... bạn sức có các file trong thư mục con. Nếu vậy, bạn có thể sử dụng lệnh find để tìm và xử lý chúng:

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

Lệnh find xác định những tập tin sử dụng các điều kiện như -name-type, sau đó lệnh -exec chạy về cơ bản cùng một điều tôi đã giới thiệu trong các trước "cho" vòng lặp. Số \; cuối cùng cho biết là find rằng đây là kết thúc của đối số cho tùy chọn -exec.

Bạn có thể man find để biết thêm chi tiết về điều này.

Lệnh find có thể di chuyển và thường được khuyến nghị cho loại hoạt động này đặc biệt nếu bạn muốn giải pháp của mình được di chuyển sang các hệ thống khác. Nhưng kể từ khi bạn đang sử dụng bash, bạn cũng có thể xử lý các thư mục con sử dụng tùy chọn bash của globstar:

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

Bạn có thể man bash và tìm kiếm cho "globstar" để biết thêm chi tiết về việc này.

LƯU Ý: Bạn có thể có các vấn đề khác với những gì bạn đang làm. Các tập lệnh PHP không cần để kết thúc bằng ?>, vì vậy, bạn có thể thêm HTML mà tập lệnh sẽ cố gắng diễn giải dưới dạng mã PHP.

+0

Lệnh find không hoạt động. –

+0

Nó đã làm gì thay vì làm việc? – ghoti

+0

Nó không làm gì cả.Không trả lại lỗi nào nhưng cũng không thêm bất kỳ dòng nào trong bất kỳ tệp nào. –

1

Bạn có thể làm (làm việc ngay cả khi có không gian trong đường dẫn tập tin của bạn):

#!/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: Bạn phải chạy script từ thư mục bạn muốn duyệt

+0

hữu ích! Cảm ơn .. – normalUser

52

Tôi thường sử dụng tee vì tôi nghĩ rằng nó trông sạch hơn một chút và nó thường phù hợp trên một dòng.

echo "my text" | tee -a *.php 
+0

Câu trả lời tuyệt vời như vậy. – pamphlet

+0

@pamphlet, đã đồng ý. – dre

+0

Đây là câu trả lời Dantastic. :-) Và kể từ khi OP đang sử dụng bash, thiết lập globstar cũng sẽ cho phép nó xử lý các tệp PHP trong các thư mục con. – ghoti

1

Bạn có thể sử dụng sed kết hợp với find. Giả cây dự án của bạn là

/MyProject/ 
    /MyProject/Page1/file.php 
    /MyProject/Page2/file.php 
    etc.   
  1. Lưu mã bạn muốn thêm vào /MyProject/. Gọi đó là append.txt
  2. Từ /MyProject/ chạy:

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

    Giải thích:

    • find làm như nó có, nó trông cho tất cả .php, bao gồm cả thư mục con
    • xargs sẽ vượt qua (tức là chạy) sed cho tất cả .php vừa được tìm thấy
    • sed sẽ thực hiện phần bổ sung. '$ r append.txt' có nghĩa là đi đến cuối tập tin ($) và viết (dán) bất cứ thứ gì có trong append.txt ở đó. Đừng quên -i nếu không nó sẽ chỉ in ra các tập tin nối và không lưu nó.

Nguồn: http://www.grymoire.com/unix/Sed.html#uh-37

Các vấn đề liên quan