2011-07-31 38 views
8

Tập lệnh này sẽ sắp xếp các tệp theo ngày sau đó di chuyển 2500 tệp đầu tiên sang một thư mục khác.
Khi tôi chạy dưới các tập lệnh, hệ thống sẽ nhắc ra Danh sách đối số quá dài. Bất cứ ai cũng có thể giúp tôi tăng cường các kịch bản? Cảm ơnDanh sách đối số quá dài - Unix

NUM_OF_FILES=2500 
FROM_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in 
DESTINATION_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in_load 

if [ ! -d $DESTINATION_DIRECTORY ] 
     then 
       echo "unused_file directory does not exist!" 
     mkdir $DESTINATION_DIRECTORY 
     echo "$DESTINATION_DIRECTORY directory created!" 
else 
     echo "$DESTINATION_DIRECTORY exist!"  
fi 


echo "Moving $NUM_OF_FILES oldest files to $DESTINATION_DIRECTORY directory" 

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -$NUM_OF_FILES | 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 
+1

bạn đang cố di chuyển chỉ 2500 tệp đầu tiên? – Sujoy

Trả lời

1

Đầu tiên tạo danh sách sao lưu các tệp cần xử lý. Sau đó đọc tập tin sao lưu từng dòng và chữa lành nó. Ví dụ:

#!/bin/bash 
NUM_OF_FILES=2500 
FROM_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in 
DESTINATION_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in_load 

if [ ! -d $DESTINATION_DIRECTORY ] 
    then 
      echo "unused_file directory does not exist!" 
    mkdir $DESTINATION_DIRECTORY 
    echo "$DESTINATION_DIRECTORY directory created!" 
    else 
    echo "$DESTINATION_DIRECTORY exist!"  
fi 

echo "Moving $NUM_OF_FILES oldest files to $DESTINATION_DIRECTORY directory" 

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -2500 > list 
exec 3<list 

while read file <&3 
do 
    mv $file $DESTINATION_DIRECTORY 
done 
+0

Cảm ơn bạn đã trả lời, sry tôi didnt có được những gì bạn có ý nghĩa. Im mới để unix, các chức năng chữa lành là gì? – user871695

+0

người dùng: Tôi đã sửa câu trả lời của mình. Cảm ơn bạn đã upvote và sự hài lòng của bạn! – Bytemain

+0

lỗi tương tự - Danh sách đối số quá dài msg. Fyi $ FROM_DIRECTORY chứa> 200k tập tin – user871695

0

Cách nhanh chóng để khắc phục điều này sẽ thay đổi thành $ FROM_DIRECTORY, để bạn có thể tham khảo tệp bằng đường dẫn tương đối (ngắn hơn).

cd $FROM_DIRECTORY && ls -tr MSCERC*.Z|head -2500 |xargs -i sh -c "mv {} $DESTINATION_DIRECTORY"

này cũng không phải là hoàn toàn fool-proof, nếu bạn có quá nhiều tác phẩm phù hợp.

+0

Cảm ơn bạn đã trả lời, tôi sẽ kiểm tra sau – user871695

+0

cùng một lỗi - Danh sách đối số quá dài msg. Fyi $ FROM_DIRECTORY chứa> 200k tệp – user871695

3

Bạn đã không nói, nhưng tôi giả định đây là nơi mà các vấn đề xảy ra: (. Bạn có thể xác minh nó bằng cách thêm "thiết lập -x" lên đỉnh kịch bản của bạn)

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -2500 | \ 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 

Vấn đề là hạt nhân có một kích thước tối đa cố định của tổng chiều dài của dòng lệnh cho một quá trình mới, và vượt quá của bạn trong lệnh ls. Bạn có thể làm việc xung quanh nó bằng cách không sử dụng globbing và thay vào đó sử dụng grep:

ls -tr $FROM_DIRECTORY/ | grep '/MSCERC\*\.Z$' |head -2500 | \ 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 

(grep sử dụng biểu thức thông thường thay vì những đống, vì vậy mô hình trông hơi khác một chút.)

+0

Cảm ơn bạn đã trả lời, tôi sẽ kiểm tra sau. – user871695

+0

lỗi tương tự - Danh sách đối số quá dài. Fyi $ FROM_DIRECTORY chứa> 200k tệp. – user871695

+0

Thật kỳ lạ.Nếu bạn có thể cung cấp đầu ra khi chạy với "set -x", chúng tôi có thể chắc chắn, nhưng dự đoán tốt nhất của tôi vào thời điểm này là bạn đã thêm dấu hoa thị vào lệnh ls hoặc có vấn đề gì đó với xargs. Nếu sau này, hãy thêm -n10 vào các tùy chọn xargs. –

2

Thay đổi

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -2500 | \ 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 

làm điều gì đó như sau:

find "$FROM_DIRECTORY" -maxdepth 1 -type f -name 'MSCERC*.Z' -printf '%p\t%[email protected]\n' | sort -k2,2 -r | cut -f1 | head -$NUM_OF_FILES | xargs mv -t "$DESTINATION_DIRECTORY" 

Sử dụng này s tìm để tạo ra một danh sách các tập tin với thời gian sửa đổi, loại bởi dấu thời gian, sau đó loại bỏ các lĩnh vực không cần thiết trước khi đi qua các đầu ra để headxargs

EDIT

biến thể khác, nên làm việc với utils phi GNU

find "$FROM_DIRECTORY" -type f -name 'MSCERC*.Z' -printf '%p\t%[email protected]' |sort -k 2,2 -r | cut -f1 | head -$NUM_OF_FILES | xargs -i mv \{\} "$DESTINATION_DIRECTORY" 
+0

Cảm ơn bạn đã trả lời, tôi sẽ kiểm tra sau – user871695

+0

@user: Bạn thực sự không cần phải thừa nhận mỗi câu trả lời – Hasturkun

+0

Tôi chạy lệnh, nó không hoạt động. Tôi đã thay đổi kịch bản khi tìm thấy $ FROM_DIRECTORY/-name 'MSCERC * .Z' | đầu -2500 | xargs -i sh -c "mv {} $ DESTINATION_DIRECTORY". Nó succeffuly di chuyển các tập tin vào thư mục destinaton. Câu hỏi của tôi là, làm thế nào để đặt hàng các tập tin theo ngày để hệ thống sẽ nhận được 2500 tập tin đầu tiên? – user871695

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