大量の特定ファイルを処理

特定ファイルを処理する場合、
lsやfindした結果をパイプで繋いで処理しますが、
特定ファイルが大量に存在する場合のメモ。

# パターンその1
# ファイルが多すぎるとエラーになる
ls *.txt | xargs rm
# パターンその2
# ファイルが多すぎるとエラーになる
find -f *.txt | xargs rm
# パターンその3
# ファイルが多すぎ手も処理できるがメモリを消費
echo *.txt | xargs rm

基本的な確認コマンドその1

  • OSのバージョン確認

    cat /etc/issue
    CentOS release 6.6 (Final)
    Kernel \r on an \m
    
  • OSのbit数確認

    uname -a
    Linux z-area.net 2.6.32-504.23.4.el6.x86_64 #1 SMP Tue Jun 9 20:57:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    

LFTPコマンドの外だし

シェルでLFTPでファイルを取得する必要があったので。

#!/bin/sh
echo "処理開始" >> result.log

# LFTP接続
lftp -f command.txt >> ftp.log

# ftp.logに先頭から始まる「abc*」がない場合
if ! grep "^abc*" ftp.log > /dev/null 2>&1; then

    # ftp.logの内容をresult.logに移し、ftp.logを初期化し、処理正常
    cat ftp.log >> result.log
    echo "処理終了(ファイルなし)" >> result.log
    cp /dev/null ftp.log
    exit 0

# ftp.logに先頭から始まる「abc*」がある場合
else

    # ftp.logの内の先頭から始まる「abc*」をgrepする
    for X in `grep "^abc*" ftp.log`
    do
        # ファイル名(grep結果)が取得できている場合(-eが存在確認)
        if [ ! -e $X ]; then

            # ftp.logの内容をresult.logに移し、ftp.logを初期化し、処理異常
            cat ftp.log >> result.log
            echo "ファイル転送エラー" >> result.log
            cp /dev/null ftp.log
            exit 1
        fi
    done
fi

# ftp.logの内容を初期化し、処理正常
echo "処理終了" >> result.log
cp /dev/null ftp.log
exit 0;
command.txtの内容
open IP
user ユーザ名 パスワード
cd /test
cls abc*.txt
mget abc*.txt

ftp.logは処理が終了すると0バイトに初期化するが、
処理中は下記状態となる。

【正常の場合(取得ファイルあり)】
abc1.txt
abc2.txt

【正常の場合(取得ファイルなし)】
ファイル取得エラー

【異常の場合】
abc1.txt
abc2.tx
ファイル転送エラー