0

目的:単語数が1000未満のファイルを検索し、それらを別のフォルダーに移動します。1k未満のファイルがすべて移動されるまでループします。

ステータス:1つのファイルのみを移動し、「ファイルが存在しないため、ファイルを移動できません。何らかの理由で$INPUT_SMALLが新しいファイル名で更新されていないようです。」というエラーが表示されます。

私は何が間違っているのですか?

現在のスクリプト:

すでに1k未満の入力ファイルを確認し、Splitフォルダーに移動します

INPUT_SMALL=$( ls -S /folder1/ | grep -i reply | tail -1  )

INPUT_COUNT=$( cat /folder1/$INPUT_SMALL 2>/dev/null | wc -l  )

function moveSmallInput() {

    while  [[ $INPUT_SMALL != ""  ]] && [[ $INPUT_COUNT -le 1003  ]]
    do
        echo "Files smaller than 1k have been found in input folder, these will be moved to the split folder to be processed."
        mv /folder1/$INPUT_SMALL /folder2/
    done
}
4

3 に答える 3

2

少し短いバージョン

#!/bin/bash
find ./folder1 -type f | while read f 
do
    (( $(wc -w "$f" | awk '{print $1}' ) < 1000 )) && cp "$f" folder2
done

安全上の理由からではcpなく、私は去りました。検証後にmv変更mv

reply@Haiのバージョンのfindコマンドを使用してフィルタリングしたい

于 2013-02-25T22:15:52.270 に答える
2

パスのどこかに応答という単語が含まれるファイルを探していると思います。私の解決策は次のとおりです。

wc -w $(find /folder1 -type f -path '*reply*') | \
    while read wordcount filename
    do
        if [[ $wordcount -lt 1003 ]]
        then
            printf "%4d %s\n" $wordcount $filename
            #mv "$filename" /folder2
        fi
    done

スクリプトを 1 回実行し、出力が正しい場合は、mvコマンドのコメントを解除して、今度は実際に実行します。

アップデート

上記の解決策では、スペースが埋め込まれたファイルで問題が発生します。この問題は、findコマンドがその出力をコマンドに渡すときに発生しwcます。少し考えた後、ここに私の修正された解決策があります:

find /folder1 -type f -path '*reply*' | \
    while read filename
    do
        set $(wc -w "$filename") # $1= word count, $2 = filename
        wordcount=$1
        if [[ $wordcount -lt 1003 ]]
        then
            printf "%4d %s\n" $wordcount $filename
            #mv "$filename" /folder2
        fi
    done
于 2013-02-25T21:23:40.160 に答える
1

あなたの変数INPUT_SMALLINPUT_COUNTは関数ではなく、一度割り当てた値です。それらをループ内に移動するか、while関数に変換して毎回評価する必要があります(現在のように変数値を展開するだけではありません)。

于 2013-02-25T20:45:58.580 に答える