例如我有文件:
file0.txt
file1.txt
file2.txt
....
file100.txt
Run Code Online (Sandbox Code Playgroud)
我想在 bash 中复制 5 个文件,这将产生结果:
file0.txt
file19.txt
file39.txt
file59.txt
file79.txt
Run Code Online (Sandbox Code Playgroud)
编辑。搞砸了计数应该是这样的:
file0.txt
file20.txt
file40.txt
file60.txt
file80.txt
Run Code Online (Sandbox Code Playgroud)
因此文件是均匀间隔采样的。希望有一些很酷的oneliner。
Sté*_*las 10
请注意,大括号扩展不是通配符,无论结果中的单词是否引用实际文件,它都会扩展。如果您只想复制那些实际存在的文件,您可以这样做:
shopt -s failglob extglob
cp file@(0|[1357]9).txt /path/to/destination/
Run Code Online (Sandbox Code Playgroud)
在 中zsh,您可以通过附加(N)(对于 nullglob)限定符来强制对任意字符串进行通配解释。
cp file{0,{1..79..20}}.txt(N) /path/to/destination/
Run Code Online (Sandbox Code Playgroud)
如果任何glob 扩展无法匹配任何内容,我们需要 nullglob 来避免错误,但这意味着如果它们都不匹配,cp /path/to/destination/则会运行。那么严格来说,应该是:
(){ if (($#)) cp $@ /path/to/destination; } file{0,{19..79..20}}.txt(N)
Run Code Online (Sandbox Code Playgroud)
或者使用以下方法(0|19|...)动态构造一个 glob:
() { cp file(${(~j[|])@}).txt /path/to/destination; } 0 {19..79..20}
Run Code Online (Sandbox Code Playgroud)
这次没有 nullglob,因此如果未找到文件,您将得到正确的不匹配错误。
要每 20 到 5 个按数字排序的列表复制一个file<digits>.txt:
() {
printf -v argv '%s%20$.0s' $argv
cp -- $argv[1,5] /path/to/destination
} file<->.txt(n)
Run Code Online (Sandbox Code Playgroud)
bash 中的大括号扩展支持以下格式的步骤{<start>..<end>..<step>}:
$ echo file{0..100..19}.txt
file0.txt file19.txt file38.txt file57.txt file76.txt file95.txt
Run Code Online (Sandbox Code Playgroud)
虽然看起来你需要不规则的间距:
$ echo file0.txt file{19..100..20}.txt
file0.txt file19.txt file39.txt file59.txt file79.txt file99.txt
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |