連続ファイルサブセットをコピーして移動する方法は?

連続ファイルサブセットをコピーして移動する方法は?

PRC1772まで、PRC0001、PRC002という名前の1772ファイルを含むディレクトリがあります。

サブセット(PRC0257からPRC1516など)を別のディレクトリにコピーするにはどうすればよいですか?すべてのグループが指定された番号から始まり、グループの最後の項目まで順番に続行されますが、これらのファイルの複数のグループを使用してこれを実行しようとしています。

bashシェルスクリプトとパラメータ.txtファイルを使用してこれを実行しようとしています...

ベストアンサー1

最も簡単な方法は、zshの番号範囲を使用することです。全体的な状況:

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

範囲演算子は、前にゼロがある場合とない数字と一致するためPRC257PRC0257などPRC00257が含まれます。たとえば、PRC<257->257で始まるすべてのファイルを移動したい場合は、範囲の終わりを空白のままにできます。その範囲内にどれだけのファイルが存在するかは問題ではありません。一般的なシェルのうち、zshだけがこの機能を持っています。

Bash、ksh93、zsh は中括弧で範囲をサポートします。これはグローバル変数ではありませんが、単純なテキスト拡張です。たとえば、これらのファイルの存在に関係なくa{9..11}拡張されます。a9 a10 a11

mv PRC{0257..1516} /else/where

複数のglobを組み合わせることもできます。これはすべてのシェルで作業できるという利点がありますが、境界が整数でない場合は扱いにくいです。

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

おすすめ記事