为什么一边不工作?

时间:2013-02-25 20:42:08

标签: bash shell loops while-loop

AIM:要查找字数少于1000的文件,请将其移动到另一个文件夹中。循环,直到所有1k以下的文件被移动。

状态:它只会移动一个文件,然后错误“无法移动文件,因为它不存在。出于某种原因,$ INPUT_SMALL似乎没有用新文件名更新。”

我做错了什么?

当前脚本:

  

检查1k以下的输入文件并移至拆分文件夹

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
}

3 个答案:

答案 0 :(得分:2)

我假设你正在寻找在路径中某处有单词reply的文件。我的解决方案是:

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

运行脚本一次,如果输出看起来正确,则取消注释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

答案 1 :(得分: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命令版本

答案 2 :(得分:1)

您的变量INPUT_SMALLINPUT_COUNT不是函数,它们只是您分配一次的值。您需要在while循环内移动它们或将它们转换为函数并每次评估它们(而不是像现在一样扩展变量值)。