2011-07-31 22 views
8

Bu komut daha sonra başka bir dizine ilk 2500 dosya taşımak tarihe göre dosyaları sıralamak. Ben komut aşağıda çalıştırdığınızda
, sistem çok uzun msj Argüman listesini istemi. Herkes senaryoları geliştirmeme yardım edebilir mi?Argüman listesi - 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

Yalnızca ilk 2500 dosyayı taşımaya mı çalışıyorsunuz? senin cevap için – Sujoy

cevap

1

İlk dosyaların yedek listesi oluşturmak ait sayesinde tedavi edilecek. Sonra yedekleme dosyasını online olarak okuyun ve iyileştirin. Örneğin

#!/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

teşekkürler, sry ne demek istediğini alamadım. Unix'e yeniyim, iyileşmenin işlevleri nedir? – user871695

+0

kullanıcı: Cevabımı düzelttim. Hoş geldiniz ve memnuniyetiniz için teşekkür ederiz! – Bytemain

+0

aynı hata - Argüman listesi çok uzun msj. Fyi $ FROM_DIRECTORY içerir> 200k dosyaları – user871695

0

sen (kısa) göreli yolları kullanarak dosyaları başvurabilir böylece $ FROM_DIRECTORY değiştirmek olacaktır Bunu düzeltmek için hızlı bir yolu için. Eğer maç çok fazla dosya varsa

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

Bu, aynı zamanda değil tamamen aptal-kanıtıdır.

+0

Yanıtınız için teşekkür ederiz, daha sonra test edeceğim – user871695

+0

aynı hata - Bağımsız değişken listesi çok uzun msg. Fyi $ FROM_DIRECTORY içerir> 200k dosyaları – user871695

3

Sen demedim ama sorun oluştuğunda budur varsayalım: (. Eğer komut üstüne "-x set" ekleyerek doğrulayabilirsiniz)

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

sorun çekirdek yeni bir işlem verilen komut hattı toplam uzunluğunun sabit bir maksimum boyuta sahiptir, ve kayıt ls komut aşan olmasıdır. Sen globbing ve yerine grep kullanarak kullanmayarak etrafında çalışabilirsiniz:

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

(grep yerine globs normal ifadeler kullanır, böylece desen biraz farklı görünüyor.)

+0

Yanıtınız için teşekkürler, daha sonra test edeceğim. – user871695

+0

aynı hata - Bağımsız değişken listesi çok uzun msg. Fyi $ FROM_DIRECTORY> 200k dosyaları içerir. – user871695

+0

Bu garip."Set -x" ile çalışmanın çıkışını sağlayabilseydiniz, emin olabilirdik, ama bu noktada en iyi tahminim, ya ls komutuna yıldız işareti eklediniz, ya da xargs ile yanlış giden bir şey. İkincisi ise, xargs seçeneklerine -n10 ekleyin. –

2

Değişim

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

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" 

Bu kullanım:

aşağıdaki gibi bir şey yapmak s modifikasyon damgaları ile dosyaların bir listesini oluşturmak için bulmak, zaman damgası ile sıralar, daha sonra head ve xargs

DÜZENLEME

başka varyantı çıktı geçirmeden önce gereksiz alanını kaldırır, sigara GNU Araçlarının ile çalışmalıdır

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

Cevabınız için teşekkürler, daha sonra test edeceğim – user871695

+0

@ user: Her bir cevabı kabul etmenize gerek yok – Hasturkun

+0

Komutu çalıştırıyorum, işe yaramadı. Ben bu dosya $ FROM_DIRECTORY/-name 'MSCERC * .Z' | kafa -2500 | xargs -i sh -c "mv {} $ DESTINATION_DIRECTORY". Bu dosyaları destinaton dizinine taşıdı. Sorularım, dosyaların tarihe göre nasıl sipariş verileceğidir, böylece sistem ilk 2500 dosyayı nasıl alacaktır? – user871695