2011-07-31 29 views
8

Esta secuencia de comandos ordenará los archivos por fecha y moverá los primeros 2500 archivos a otro directorio.
Cuando ejecuto las secuencias de comandos a continuación, la solicitud del sistema muestra la lista de argumentos demasiado larga. ¿Alguien puede ayudarme a mejorar los guiones? GraciasLista de argumentos demasiado larga: 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

¿Está intentando mover solo los primeros 2500 archivos? – Sujoy

Respuesta

1

Primero cree una lista de respaldo de los archivos a tratar. Luego lea el archivo de respaldo línea por línea y cúrelo. Por ejemplo

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

Gracias por su respuesta, sry. No entendí lo que quiere decir. Soy nuevo en Unix, ¿cuáles son las funciones de curación? – user871695

+0

usuario: he corregido mi respuesta. ¡Gracias por tu voto positivo y satisfacción! – Bytemain

+0

mismo error - Lista de argumentos demasiado larga msg. Fyi $ FROM_DIRECTORY contiene> 200k archivos – user871695

0

Una forma rápida de solucionar este problema sería cambiar a $ FROM_DIRECTORY, por lo que se puede hacer referencia a los archivos a través de rutas relativas (más cortos).

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

Esto tampoco es totalmente a prueba de tontos, si usted tiene demasiados archivos que coinciden.

+0

Gracias por su respuesta, la probaré más tarde – user871695

+0

mismo error - Lista de argumentos demasiado larga msg. Fyi $ FROM_DIRECTORY contiene> 200k archivos – user871695

3

que no has dicho, pero supongo que aquí es donde se produce el problema: (. Usted puede verificar mediante la adición de "set-x" a la parte superior de la secuencia de comandos)

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

El problema es que el kernel tiene un tamaño máximo fijo de la longitud total de la línea de comando asignada a un nuevo proceso, y lo excede en el comando ls. Puede trabajar alrededor de ella al no utilizar comodines y en su lugar usando grep:

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

(grep utiliza expresiones regulares en lugar de globos, por lo que el patrón se ve un poco diferente.)

+0

Gracias por su respuesta, la probaré más tarde. – user871695

+0

mismo error - Lista de argumentos demasiado larga msg. Fyi $ FROM_DIRECTORY contiene> 200k archivos. – user871695

+0

Eso es extraño.Si pudieras proporcionar el resultado de ejecutar con "set -x", podríamos estar seguros, pero mi mejor suposición en este punto es que o agregaste un asterisco al comando ls, o algo sale mal con xargs. Si es el último, agrega -n10 a las opciones de xargs. –

2

Cambio

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

hacer algo como lo siguiente:

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" 

Este uso s encuentran para crear una lista de archivos con marcas de tiempo de modificación, ordena por la marca de tiempo, a continuación, elimina el campo que no sean necesarios antes de pasar la salida a head y xargs

EDITAR

Otra variante, debe trabajar con utilidades no 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

Gracias por su respuesta, voy a probarlo más tarde – user871695

+0

@user: Realmente no hay necesidad de que usted reconozca cada respuesta – Hasturkun

+0

Ejecuto el comando, no funcionó. Cambié los scripts ya que encontré $ FROM_DIRECTORY/-name 'MSCERC * .Z' | cabeza -2500 | xargs -i sh -c "mv {} $ DESTINATION_DIRECTORY". Movió con éxito los archivos al directorio destinaton. Mi pregunta es, ¿cómo ordenar los archivos por fecha para que el sistema recoja los primeros 2500 archivos? – user871695

Cuestiones relacionadas