如何将文本大量添加到文件名之前?


40

可以说我有一个目录 .md 文件全部命名各种东西。假设我想在每个文件名的前面添加“text”。例如:文件 a.mdb.md,和 c.md 会成为 test - a.mdtest - b.md,和 test - c.md

我如何通过命令行完成此操作?

Answers:


53

可以从终端直接轻松输入的单线程:

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

在这里,我们的 NAMEf 和我们的 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

这正是我需要看到的。谢谢!
Ryan

11

如果你有 prename...

prename 's/^/test - /' *.md

使用普通的shell命令:

for file in *.md; do
    mv "$file" "test - $file"
done

如何得到 prename
Gaʀʀʏ

似乎是在Ubuntu 16.04 LTS上为我预装的。你有没有尝试过你的包管理器(即。 sudo apt-get install )?
Orion751

5

mmv 1 2 对于这样的任务来说,它也是一个非常好的工具,适用于当前的工作,它会是

mmv '*.md' 'test - #1.md'

当然,如果您只想将“test - ”添加到a.md,b.md和c.md,而不是a1.md,就像

mmv '?.md' 'test - #1.md'

会更合适。

我真的可以建议,特别是如果你有很多这样的问题。

如果您还在寻找图形界面,请尝试 gprename


4

除非你重新定义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只打印文件名 - 没有路径组件会使重命名操作中断。


0

如果你有 zsh 可以使用 zmv

autoload zmv
zmv -w '*' 'test - $1'

您可以使用以下命令测试命令:

zmv -wn '*' 'test - $1'
  • -n 意味着干运行,即只显示会发生什么。
  • -w 隐含地将括号放在通配符周围,使反向引用起作用。

0

在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
David Richerby

0

我知道现在已经很晚了,但是如果有其他人在寻找这样的东西,那么这对我有用:

rename '' 'name -' *.md
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.