例子:
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
└── s4
4 directories, 6 files
我想复制 f1.md/f2.md/f3.md
到当前目录,结果是t-f1.md/t-f2.md/t-f3.md
.(前缀是t-
)
尝试与希望:
for file in *md;do cp -a $file t-$file;done
会得到结果,但使用循环似乎很长for
。我希望如果有更短和简单的命令来获得相同的结果。
答案1
使用 GNU 的最短路线parallel
:
parallel --no-notice 'cp "{}" "t-{}"' ::: *.md
https://www.gnu.org/software/parallel/parallel_tutorial.html
答案2
要复制文件,您已有的循环是最短的方法。如果你想在没有循环的情况下完成它,你可以组合cp
rename
和mv
mkdir tmp
cp -a *.md tmp
(cd tmp && rename '' 't-' tmp/*.md)
mv temp/*.md .
这减少了您必须运行的命令(只有一个 cp 命令与每个文件一个命令),这可能会或可能不会使程序运行得更快 - 您需要对其进行基准测试。但如果您有大量文件,则会失败,因为我们将所有文件传递到cp
rename
和mv
。
答案3
和mmv
/ mcp
:
mcp '*.md' t-#1.md
前任。给定
$ tree .
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
└── s4
0 directories, 10 files
然后
$ mcp -v '*.md' t-#1.md
f1.md -> t-f1.md : done
f2.md -> t-f2.md : done
f3.md -> t-f3.md : done
导致
$ tree .
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
├── s4
├── t-f1.md
├── t-f2.md
└── t-f3.md
0 directories, 13 files