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
}
答案 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_SMALL
和INPUT_COUNT
不是函数,它们只是您分配一次的值。您需要在while
循环内移动它们或将它们转换为函数并每次评估它们(而不是像现在一样扩展变量值)。