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 NAME
isf
和 our WORDS
are 匹配当前目录中的所有文件*.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
mmv
1 , 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。
而不是使用 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 将只打印文件名 - 没有路径组件,这会使重命名操作中断。