可以说我有一个目录 .md
文件全部命名各种东西。假设我想在每个文件名的前面添加“text”。例如:文件 a.md
, b.md
,和 c.md
会成为 test - a.md
, test - b.md
,和 test - c.md
。
我如何通过命令行完成此操作?
可以说我有一个目录 .md
文件全部命名各种东西。假设我想在每个文件名的前面添加“text”。例如:文件 a.md
, b.md
,和 c.md
会成为 test - a.md
, test - b.md
,和 test - c.md
。
我如何通过命令行完成此操作?
Answers:
可以从终端直接轻松输入的单线程:
for f in *.md; do mv "$f" "test - $f"; done
或者使用分号在单独的行上重写:
for f in *.md
do
mv "$f" "test - $f"
done
语法 for
(在 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
除非你重新定义IFS变量,否则我会建议使用while循环结合find,而不是使用for循环,它会在空格上失败。从与文件相同的目录运行时,以下内容将起作用
find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
file=$(basename $file)
mv "$file" "test - $file"
done
“basename”行在那里,所以find只打印文件名 - 没有路径组件会使重命名操作中断。
在bash中,将“Prepend text - ”添加到文件夹中的所有文件:
for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
for i in *; do mv "$i$" "Prepend text - $i"; done