0

目标:查找字数少于 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
}
4

3 回答 3

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

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

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

于 2013-02-25T20:45:58.580 回答