如何复制和移动文件的连续子​​集?

如何复制和移动文件的连续子​​集?

我有一个目录,包含 1772 个文件,分别名为 PRC0001、PRC002……直到 PRC1772。

如何将子集(例如 PRC0257 到 PRC1516)复制到其他目录?我正在尝试对这些文件的多个组执行此操作,尽管所有组都从给定的编号开始,并按顺序继续到该组中的最后一项。

我正在尝试使用 bash shell 脚本和parameter.txt 文件来执行此操作...

答案1

最简单的方法是使用 zsh 的数字范围全局:

mv PRC<257-1516> /else/where/

范围运算符匹配带或不带前导零的数字,因此PRC257PRC0257PRC00257等都包含在内。您可以将范围末尾留空,例如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/

相关内容