2011-07-31 14 views
8

このスクリプトはファイルを日付順にソートし、最初の2500ファイルを別のディレクトリに移動します。
以下のスクリプトを実行すると、引数リストが長すぎるというメッセージが表示されます。誰でもスクリプトを強化できますか?ありがとう引数リストが長すぎます - 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

最初の2500ファイルだけを移動しようとしていますか? – Sujoy

答えて

1

最初に、処理するファイルのバックアップリストを作成します。次に、バックアップファイルを1行ずつ読み込んでそれを修復します。例

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

あなたの返事をありがとう、私はあなたが何を意味していないsry。私はUnixに新しい、癒しの機能は何ですか? – user871695

+0

ユーザー:私は自分の答えを修正しました。あなたのupvoteと満足感ありがとう! – Bytemain

+0

同じエラー - 引数リストが長すぎますmsg。 Fyi $ FROM_DIRECTORYに> 200k個のファイルが含まれています – user871695

0

のためにこの問題を解決する簡単な方法は、あなたが(短い)相対パスを使用してファイルを参照できるように、$ FROM_DIRECTORYに変更することです。

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

あなたが一致して非常に多くのファイルを持っている場合、これは、また、完全にばかプルーフではありません。

+0

あなたの返事をありがとう、私は後でそれをテストします – user871695

+0

同じエラー - 引数リストが長すぎるmsg。 Fyi $ FROM_DIRECTORYに> 200kファイルが含まれています – user871695

3

あなたは言いませんでしたが、私は、問題が発生したところ、これがあると仮定します。

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

(あなたのスクリプトの先頭に「-x設定」を追加し、それを確認することができます。)

問題は、カーネルに新しいプロセスに与えられたコマンドラインの全長の固定された最大サイズと、lsコマンドのそれを超えることです。あなたはグロビング、代わりにgrepを使用して使用しないことによってそれを回避することができます。

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

grepではなく、グロブの正規表現を使用するため、パターンは少し異なります。)

+0

あなたの返信ありがとうございます、私は後でそれをテストします。 – user871695

+0

同じエラー - 引数リストが長すぎますmsg。 Fyi $ FROM_DIRECTORYには> 200k個のファイルが含まれています。 – user871695

+0

それは変です。"set -x"を実行して出力することができれば確信できますが、この時点ではlsコマンドにアスタリスクを追加するか、xargsに何か問題があります。後者の場合は、-n10をxargsオプションに追加します。 –

2

変更

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" 

この使用:

は、次のような何かをsが修正のタイムスタンプとファイルのリストを作成するために見つけ、タイムスタンプでソートは、その後、headxargs

EDIT

別の変形に出力を渡す前に、不要なフィールドを削除し、非GNU utilsので動作するはずです

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

あなたの返信ありがとう、私は後でそれをテストします – user871695

+0

@user:実際には、各回答を確認する必要はありません – Hasturkun

+0

私はコマンドを実行し、それは仕事をしませんでした。私はこのスクリプトが$ FROM_DIRECTORY/-name 'MSCERC * .Z'を見つけたので変更しました。頭部-2500 | xargs -i sh -c "mv {} $ DESTINATION_DIRECTORY"と入力します。それは、ファイルをdestinatonディレクトリに移動します。私の質問は、システムが最初の2500ファイルを拾うようにファイルを日付順に並べる方法です。 – user871695

関連する問題