2012-09-10 18 views
16

Tôi có một thư mục trong máy chủ chứa một số tập tin. Đây là những điều tự động có nghĩa là hàng ngày chúng ta sẽ tự động nhận được các tệp mới sẽ ghi đè lên những tệp cũ. Vì vậy, muốn sao lưu dữ liệu này. Làm cách nào để sao chép tất cả các tệp này vào một thư mục khác bằng cách đổi tên tệp với ngày hiện tại trong khi sao chép.Shell script để sao chép các tập tin từ một địa điểm này sang một vị trí khác và đổi tên thêm ngày hiện tại vào mỗi tập tin

ví dụ: tôi có thư mục có tên folder1 chứa 4 tệp. con đường cho thư mục này là home/webapps/project1/folder1

  1. aaa.csv
  2. bbb.csv
  3. ccc.csv
  4. ddd.csv

bây giờ tôi muốn sao chép tất cả bốn tệp này trong một thư mục khác có tên là folder2. đường dẫn cho thư mục này là home/webapps/project1/folder2. trong khi sao chép các tệp này, tôi muốn đổi tên từng tệp và thêm ngày hiện tại vào tệp. nên tên tập tin của tôi trong folder2 nên ..

  1. aaa091012.csv
  2. bbb091012.csv
  3. ccc091012.csv
  4. ddd091012.csv

Tôi muốn viết một vỏ kịch bản cho việc này. Xin vui lòng cho tôi một số ý tưởng hoặc một số kịch bản mẫu liên quan đến điều này.

+0

Bạn có thể muốn "di chuyển" các tệp vào thư mục mới của mình thay vì "sao chép".Nếu không, lần sau khi bạn chạy tập lệnh, bạn sẽ sao chép tệp ngay cả khi chúng không thay đổi. Với câu trả lời được cung cấp, sử dụng lệnh 'mv' thay vì' cp'. Nếu hai thư mục nằm trên các hệ thống tệp khác nhau (nghĩa là bạn không thể sử dụng 'mv'), hãy thêm lệnh' rm' để xóa tệp nguồn sau bản sao. Và nếu bạn ** cần ** sử dụng 'cp', tôi sẽ thêm tùy chọn' -p' để giữ dấu thời gian ban đầu. – BellevueBob

+0

@ran, cho máy chủ Linux cũng vậy, câu trả lời dưới đây sẽ hoạt động ???? –

Trả lời

23

Trong bash, miễn là bạn tập tin tên không có không gian:

cd /home/webapps/project1/folder1 
for f in *.csv 
do 
    cp -v "$f" /home/webapps/project1/folder2/"${f%.csv}"$(date +%m%d%y).csv 
done 
+1

làm việc tuyệt vời ... cảm ơn bạn :) – ran

+0

hi .. tôi muốn thêm các tệp này vào danh sách và lặp qua danh sách đó ... làm cách nào tôi có thể làm điều đó .... – ran

+0

@StephaneRouberol, cho máy chủ Linux cũng có, câu trả lời này sẽ hoạt động ??? –

1

Bạn có thể sử dụng tập lệnh như dưới đây. Bạn chỉ cần thay đổi các tùy chọn ngày để phù hợp với định dạng bạn muốn.

#!/bin/bash 

for i in `ls -l /directroy` 
do 
cp $i /newDirectory/$i.`date +%m%d%Y` 
done 
+0

$ i.'date +% m% d% Y' thực hiện việc này tạo tệp dưới định dạng aaa.091012.csv ... tôi không muốn bất kỳ 'dấu chấm nào trong tên tệp của tôi ... tên phải được chỉ định tên. csv (aaa091012.csv) .. ??? – ran

+0

chỉ cần xóa. sau lệnh $ i và trước ngày tháng. – Lipongo

+0

Tôi có cảm giác mình bị bỏ phiếu vì một số người đọc nhầm lệnh ls của tôi là có chữ L thường, nó là số một. Điều này xuất ra mỗi tệp trên một dòng. – Lipongo

2
path_src=./folder1 
path_dst=./folder2 
date=$(date +"%m%d%y") 
for file_src in $path_src/*; do 
    file_dst="$path_dst/$(basename $file_src | \ 
    sed "s/^\(.*\)\.\(.*\)/\1$date.\2/")" 
    echo mv "$file_src" "$file_dst" 
done 
1

Có một cách thích hợp để phân chia các tên tập tin và phần mở rộng: Extract filename and extension in Bash

Bạn có thể áp dụng nó như thế này:

date=$(date +"%m%d%y") 
for FILE in folder1/*.csv 
do 
    bname=$(basename "$FILE") 
    extension="${bname##*.}" 
    filenamewoext="${bname%.*}" 
    newfilename="${filenamewoext}${date}.${extension} 
    cp folder1/${FILE} folder2/${newfilename} 
done 
0
cp --archive home/webapps/project1/folder1/{aaa,bbb,ccc,ddd}.csv home/webapps/project1/folder2 
rename 's/\.csv$/'$(date +%m%d%Y).csv'/' home/webapps/project1/folder2/{aaa,bbb,ccc,ddd}.csv 

Giải thích:

  • --archive đảm bảo rằng các tập tin được sao chép với quyền sở hữu và quyền tương tự.
  • foo{bar,baz} được mở rộng thành foobar foobaz.
  • rename là một chương trình thường có sẵn để thực hiện chính xác loại thay thế này.

PS: don't use ls for this.

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