均一に分散されたファイルサブセットのコピー

均一に分散されたファイルサブセットのコピー

たとえば、次のファイルがあります。

file0.txt
file1.txt
file2.txt
....
file100.txt

Bashから5つのファイルをコピーしたいです。結果は次のとおりです。

file0.txt
file19.txt
file39.txt
file59.txt
file79.txt

編集する。台無しにした数は次のようになります。

file0.txt
file20.txt
file40.txt
file60.txt
file80.txt

したがって、ファイルは一定の間隔でサンプリングされます。素敵なオネライナーがありますように。

ベストアンサー1

中括弧拡張はワイルドカードではなく、結果の単語が実際のファイルを参照しているかどうかに関係なく拡張されます。実際に存在するファイルのみをコピーするには、次のようにします。

shopt -s failglob extglob
cp file@(0|[1357]9).txt  /path/to/destination/

では、zsh修飾子を追加して(nullglobの場合)、任意の文字列のワイルドカード解析を強制できます。(N)

cp file{0,{1..79..20}}.txt(N) /path/to/destination/

エラーを防ぐにはnullglobが必要です。どのグローバル拡張はどんなものとも一致できません。しかし、これは一致がなければcp /path/to/destination/実行されることを意味します。したがって、厳密に言えば、次のようになります。

(){ if (($#)) cp $@ /path/to/destination; } file{0,{19..79..20}}.txt(N)

または、以下を使用して(0|19|...)動的にグローブを設定します。

() { cp file(${(~j[|])@}).txt /path/to/destination; } 0 {19..79..20}

今回はnullglobがないので、正しい結果が得られます。矛盾ファイルが見つからないとエラーが発生します。

20〜5個の数字でソートされたリストをすべてコピーするには、次の手順を実行しますfile<digits>.txt

() {
  printf -v argv '%s%20$.0s' $argv
  cp -- $argv[1,5] /path/to/destination
} file<->.txt(n)

おすすめ記事