我想移动所有包含大于 25 的数字的文件(至少在一个实例中),但在字符串 > 之后不包含任何小于 25 的数字随机数_xxx_ 到特定文件夹。
需要移动的文件示例:
>23424_xxx_26
>331134_xxx_27
>6634_xxx_30
不需要移动的文件示例:
>22234_xxx_20
>434534_xxx_27
答案1
因此,第一个问题是检测需要移动的文件。
这可以使用以下方法完成grep
:
grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]{3,})$'
如果输入数据包含与给定扩展正则表达式匹配的行,这些命令将返回 true。
该表达式_(1?[0-9]|2[0-4])$
将匹配下划线后的行尾处出现的任何小于 25 的正整数,并_(2[5-9]|[3-9][0-9]|[0-9]{3,})$
匹配下划线后的行尾处的任何大于或等于 25 的正整数(假设没有零填充的整数)例如002
)。我们还在>
行的开头匹配。该选项实际上-q
会停止grep
输出任何东西(我们只关心是否能找到其中一行)。
对于要复制的文件,第一个文件grep
必须返回错误的第二个grep
必须返回真的。
将其应用于目录中的每个文件(在这种情况下,无论文件被称为什么,因为您没有对此说什么):
for filename in ./*; do
[ ! -f "$filename" ] && continue
if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]{3,})$' "$filename"
then
mv -i "$filename" /some/destination
fi
done
这会将满足要求的文件移动到 的某个目标目录/some/destination
。该-i
选项mv
将导致实用程序在覆盖与要移动的文件同名的现有文件之前要求确认。
循环中的第一个[ ! -f ... ]
测试将跳过目录中非常规文件(或常规文件的符号链接)的任何内容。