2011-07-31 13 views
8

Skrypty posortują pliki według daty, a następnie przenieszą pierwsze 2500 plików do innego katalogu.
Kiedy uruchamiam poniżej skryptów, system monituje o zbyt długą listę komunikatów Argg. Ktoś może mi pomóc ulepszyć skrypty? DziękiLista argumentów zbyt długa - 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

Czy próbujesz przenieść tylko pierwsze 2500 plików? – Sujoy

Odpowiedz

1

Najpierw utwórz listę kopii zapasowych plików do przetworzenia. Następnie odczytaj plik kopii zapasowej line-by-line i ulecz go. Na przykład

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

Dziękuję za odpowiedź, sry nie dostałem tego, co masz na myśli. Jestem nowy w unixie, jakie są funkcje leczenia? – user871695

+0

użytkownik: Poprawiłem moją odpowiedź. Dziękuję za wygraną i satysfakcję! – Bytemain

+0

ten sam błąd - zbyt długa lista komunikatów msg. Fyi $ FROM_DIRECTORY zawiera> 200k plików – user871695

0

szybki sposób rozwiązać ten problem byłoby zmienić $ FROM_DIRECTORY, tak, że można odnieść pliki za pomocą (krótsze) ścieżek względnych.

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

To również nie jest całkowicie idiotoodporny, jeśli masz zbyt wiele plików, które pasują.

+0

Dzięki za odpowiedź, przetestuję to później – user871695

+0

ten sam błąd - Lista argumentów za długi msg. Fyi $ FROM_DIRECTORY zawiera> 200k plików – user871695

3

nie powiedziałeś, ale zakładam, że to jest, gdy pojawia się problem: (. Można go zweryfikować poprzez dodanie „set -x” na górze skryptu)

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

Problem polega na tym, że jądro ma ustalony maksymalny rozmiar całkowitej długości wiersza poleceń przydzielonego nowemu procesowi, a także jego przekroczenie w poleceniu ls. Można to obejść nie używając masek i zamiast korzystania grep:

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

(grep używa wyrażeń regularnych zamiast globs, więc wzór wygląda trochę inaczej.)

+0

Dzięki za odpowiedź, przetestuję to później. – user871695

+0

ten sam błąd - lista argumentów za długi msg. Fyi $ FROM_DIRECTORY zawiera> 200k plików. – user871695

+0

To dziwne.Jeśli mógłbyś dostarczyć dane wyjściowe z działania z "set -x", moglibyśmy być pewni, ale w tym momencie domyślam się, że albo dodałeś gwiazdkę do polecenia ls, albo coś pójdzie nie tak z xargs. Jeśli to drugie, dodaj -n10 do opcji xargs. –

2

Zmień

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

zrobić coś jak następuje:

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" 

tego zastosowania Znajdźmy stworzyć listę plików z modyfikacją znaczników czasu, sortuje według znacznika czasu, a następnie usuwa pole niepotrzebne przed przekazaniem wyjście do head i xargs

EDIT

innego wariantu, powinny działać z nie utils 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

Dzięki za odpowiedź, przetestuję to później – user871695

+0

@user: Naprawdę nie ma potrzeby, abyś potwierdzał każdą odpowiedź – Hasturkun

+0

Uruchomiłem polecenie, to nie działa. Zmieniłem skrypty, tak aby znaleźć $ FROM_DIRECTORY/-name 'MSCERC * .Z' | głowa -2500 | xargs -i sh -c "mv {} $ DESTINATION_DIRECTORY". Pomyślnie przeniósł pliki do katalogu destinaton. Moje pytania brzmią: jak zamówić pliki według daty, aby system pobrał pierwsze 2500 plików? – user871695

Powiązane problemy