我有一个目录,包含 1772 个文件,分别名为 PRC0001、PRC002……直到 PRC1772。
如何将子集(例如 PRC0257 到 PRC1516)复制到其他目录?我正在尝试对这些文件的多个组执行此操作,尽管所有组都从给定的编号开始,并按顺序继续到该组中的最后一项。
我正在尝试使用 bash shell 脚本和parameter.txt 文件来执行此操作...
答案1
最简单的方法是使用 zsh 的数字范围全局:
mv PRC<257-1516> /else/where/
范围运算符匹配带或不带前导零的数字,因此PRC257
、PRC0257
、PRC00257
等都包含在内。您可以将范围末尾留空,例如PRC<257->
将所有文件从 257 开始移动。该范围内存在多少个文件并不重要。在常见的shell中,只有zsh才有这个功能。
Bash、ksh93 和 zsh 支持大括号中的范围。这不是一个全局变量,而是一个简单的文本扩展,例如a{9..11}
扩展为a9 a10 a11
无论这些文件是否存在。
mv PRC{0257..1516} /else/where
您还可以组合多个 glob;这具有在任何 shell 中工作的优点,但是当你的边界不是整数时,它就很笨拙。
mv PRC025[7-9] PRC02[6-9][0-9] PRC0[3-9][0-9][0-9] PRC1[0-4][0-9][0-9] PRC150[0-9] PRC151[0-6] /else/where
或者,您可以在全局和过滤器中更具包容性。
for x in PRC[0-9]*; do
n=${x#PRC}
n=${x%"${x##*[!0]*}"} # strip leading zeroes (beware that numbers with a leading 0 are parsed in octal)
if [ "$x" -ge 257 ] && [ "$x" -le 1516 ]; then mv "#x" /else/where; fi
done
答案2
选择大括号中的范围:
cp PRC{0257..1516} destination/