假设我有一个目录,里面.md
全是各种名称的文件。假设我想在每个文件名前面加上“test”。例如:文件a.md
、b.md
、 和c.md
将变成test - a.md
、test - b.md
、 和test - c.md
。
我如何通过命令行实现这一点?
答案1
可以直接从终端轻松输入的一行代码:
for f in *.md; do mv "$f" "test - $f"; done
或者使用分号在单独的行上重写:
for f in *.md
do
mv "$f" "test - $f"
done
展览
for
(in )的语法sh
:
for NAME [in WORDS ... ] ; do COMMANDS; done
这里,我们的NAME
是f
和我们的WORDS
是当前目录中所有匹配的文件*.md
。因此变量$f
将被替换为每个匹配的文件*.md
。
因此对于a.md
:
mv "$f" "test - $f"
变成
mv "a.md" "test - a.md"
引号很重要,因为每个文件名$f
可能包含空格。否则mv
会认为每个单词都是一个单独的文件。例如,如果没有引号,并且有一个名为的文件Foo Bar.md
,它将翻译为:
mv Foo Bar.md test - Foo Bar.md
这不会按预期工作。但是通过括$f
在引号中,它就有意义了:
mv "Foo Bar.md" "test - Foo Bar.md"
注意的语法for
,您还可以*.md
通过明确命名每个文件来重命名所有文件的子集:
for f in a.md b.md d.md; do mv "$f" "Test - $f"; done
或者使用 shell 扩展:
for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
答案2
如果你有prename
...
prename 's/^/test - /' *.md
使用普通 shell 命令:
for file in *.md; do
mv "$file" "test - $file"
done
答案3
答案4
我知道已经很晚了,但如果其他人正在寻找这样的东西,那么这对我有用:
rename '' 'name -' *.md