Rhys
Rhys

Reputation: 2877

Why is while not not working?

AIM: To find files with a word count less than 1000 and move them another folder. Loop until all under 1k files are moved.

STATUS: It will only move one file, then error with "Unable to move file as it doesn't exist. For some reason $INPUT_SMALL doesn't seem to update with the new file name."

What am I doing wrong?

Current Script:

Check for input files already under 1k and move to Split folder

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
}

Upvotes: 0

Views: 117

Answers (3)

user000001
user000001

Reputation: 33387

A somewhat shorter version

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

I left cp instead of mv for safery reasons. Change to mv after validating

I you also want to filter with reply use @Hai's version of the find command

Upvotes: 2

Hai Vu
Hai Vu

Reputation: 40783

I assume you are looking for files that has the word reply somewhere in the path. My solution is:

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

Run the script once, if the output looks correct, then uncomment the mv command and run it for real this time.

Update

The above solution has trouble with files with embedded spaces. The problem occurs when the find command hands its output to the wc command. After a little bit of thinking, here is my revised soltuion:

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

Upvotes: 2

Ben Jackson
Ben Jackson

Reputation: 93900

Your variables INPUT_SMALL and INPUT_COUNT are not functions, they're just values you assigned once. You either need to move them inside your while loop or turn them into functions and evaluate them each time (rather than just expanding the variable values, as you are now).

Upvotes: 1

Related Questions