![如何在不使用for循环的情况下通过在一个命令行中在当前目录中添加前缀来批量cp文件并重命名?](https://linux22.com/image/121058/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E4%BD%BF%E7%94%A8for%E5%BE%AA%E7%8E%AF%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E9%80%9A%E8%BF%87%E5%9C%A8%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%AD%E5%9C%A8%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%B7%BB%E5%8A%A0%E5%89%8D%E7%BC%80%E6%9D%A5%E6%89%B9%E9%87%8Fcp%E6%96%87%E4%BB%B6%E5%B9%B6%E9%87%8D%E5%91%BD%E5%90%8D%EF%BC%9F.png)
例子:
.
├── 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