web-dev-qa-db-ja.com

コマンドラインでファイルの範囲をコピーする(ZSH / BASH)

サフィックスとして連続番号が付いているファイルのリストがあります。これらのファイルの範囲のみをコピーしたいと思います。 cpコマンドの一部として範囲を指定するにはどうすればよいですか。

$ls
P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG*
P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG*

次のようなファイルをP1080275.JPGからP1080283.JPGにコピーしたいと思います。

$cp P10802[75-83].JPG ~/Images/.

これを行う方法はありますか?

12
Amjith

あなたはとても親しかった。あなたの質問はほぼ正しい構文でした:

cp P10802{75..83}.JPG ~/Images
23
glenn jackman

Bashの範囲を反復するには:

for x in {0..10}; do echo $x; done

あなたのケースで同じを適用する:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done
9

Zsh、extendedglobオプションを指定すると、globbing(パターンマッチング)演算子が追加されます。

setopt extendedglob
echo P10802<75-83>.JPG

そのパターンに一致する現在のディレクトリのファイル名に一致します(P1080275.JPGは一致しますが、P108020000000075.JPGも一致することに注意してください)

一方、{x ... y}文字列展開演算子(zshとbashおよびksh93の最近のバージョンでサポートされています)は、現在のディレクトリにあるファイルに関係なく、xからyまでの文字列に展開されます。

cp P10802<75-83>.JPG ~there

一致するファイルをコピーするので、

cp P10802{75..83}.JPG ~there

ただし、たとえばP1080281.JPGが存在しない場合、エラーが発生します。

4
sch

これはあなたのために働きますか:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
1