如何在文件名前添加大量文本?

Jes*_*son 54 unix terminal sed command-line

假设我有一个目录,其中包含.md所有命名为各种内容的文件。假设我想在每个文件名的前面加上“test”。例如: file a.md, b.md, andc.md会变成test - a.md, test - b.md, and test - c.md

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

Dan*_*han 74

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

for f in *.md; do mv "$f" "test - $f"; done
Run Code Online (Sandbox Code Playgroud)

或者改写在单独的行上,而不是使用分号:

for f in *.md
do
    mv "$f" "test - $f"
done
Run Code Online (Sandbox Code Playgroud)

博览会

for(in sh) 的语法:

for NAME [in WORDS ... ] ; do COMMANDS; done
Run Code Online (Sandbox Code Playgroud)

在这里,our NAMEisf和 our WORDSare 匹配当前目录中的所有文件*.md。因此该变量$f将被替换为每个匹配的文件*.md

所以对于a.md

mv "$f" "test - $f"
Run Code Online (Sandbox Code Playgroud)

变成

mv "a.md" "test - a.md"
Run Code Online (Sandbox Code Playgroud)

引号很重要,因为每个文件名$f可能包含空格。否则mv会认为每个单词都是一个单独的文件。例如,如果没有引号,并且有一个名为 的文件Foo Bar.md,它将转换为:

mv Foo Bar.md test - Foo Bar.md
Run Code Online (Sandbox Code Playgroud)

这不会按预期工作。但是通过$f用引号括起来,这是有道理的:

mv "Foo Bar.md" "test - Foo Bar.md"
Run Code Online (Sandbox Code Playgroud)

注意 的语法for,您还可以*.md通过显式命名每个文件来重命名所有文件的子集:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done
Run Code Online (Sandbox Code Playgroud)

或者使用外壳扩展:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
Run Code Online (Sandbox Code Playgroud)


use*_*686 11

如果你有prename...

prename 's/^/test - /' *.md
Run Code Online (Sandbox Code Playgroud)

使用普通的 shell 命令:

for file in *.md; do
    mv "$file" "test - $file"
done
Run Code Online (Sandbox Code Playgroud)


小智 7

mmv1 , 2对于这样的任务来说也是一个非常不错的工具,应用到当前的工作中,那就是

mmv '*.md' 'test - #1.md'
Run Code Online (Sandbox Code Playgroud)

当然,如果你只想在 a.md、b.md 和 c.md 中添加“test -”,而不是 a1.md,类似

mmv '?.md' 'test - #1.md'
Run Code Online (Sandbox Code Playgroud)

会更合适。

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

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


Fri*_*sen 6

而不是使用 for 循环,除非您重新定义 IFS 变量,否则它会在空格上失败,我建议将 while 循环与 find 结合使用。从与文件相同的目录运行时,以下内容将起作用

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done
Run Code Online (Sandbox Code Playgroud)

“basename”行在那里,这样 find 将只打印文件名 - 没有路径组件,这会使重命名操作中断。