如何在不使用for循环的情况下通过在一个命令行中在当前目录中添加前缀来批量cp文件并重命名?

如何在不使用for循环的情况下通过在一个命令行中在当前目录中添加前缀来批量cp文件并重命名?

例子:

.
├── 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 renamemv

mkdir tmp
cp -a *.md tmp
(cd tmp && rename '' 't-' tmp/*.md)
mv temp/*.md .

这减少了您必须运行的命令(只有一个 cp 命令与每个文件一个命令),这可能会或可能不会使程序运行得更快 - 您需要对其进行基准测试。但如果您有大量文件,则会失败,因为我们将所有文件传递到cp renamemv

答案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

相关内容