给定以下文件:
english_api
english_overview
style.css
我想要得到:
english_api.html
english_overview.html
style.css
换句话说,如何.
使用终端将文本附加到目录内不包含点()的所有文件。
显然该文件夹中有很多文件;我只是写了 3 作为示例。
如果我要在该文件夹中替换.css
,.html
我会使用:
rename .css .html *.css
但我真的想不出一种方法来匹配不包含任何内容的文件。此外,如何使用rename
命令附加(与替换)?
答案1
尝试这个find
命令,
find . -type f ! -name "*.*" -exec mv {} {}.html \;
它将当前目录中文件名中不包含点的文件重命名为以下filename.html
格式(.html
最后添加)。
.
--> 代表当前目录
-type f
--> 仅对文件执行此操作。
! -name "*.*"
--> 打印名称中没有点的文件的名称。
-exec mv {} {}.html
-->find
命令对提取的文件名执行此移动(或)重命名操作。
\;
--> 代表命令的结束find
。
答案2
在 bash 中,你可以使用扩展的 shell 全局变量例如
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done
(echo
确认匹配正确模式后删除)。如果扩展通配符尚未启用,您可以使用 来启用它shopt -s extglob
。
另一个选择是使用基于 perl 的rename
函数和排除文字的正则表达式.
rename -nv 's/^[^.]+$/$&.html/' path/to/files/*
(n
一旦确认它与正确的模式匹配,就删除该选项)。
答案3
在这种情况下我首选的是mmv
。它在 Ubuntu 中默认未安装,但您可以使用sudo apt-get install mmv
命令安装。
对于您来说,您需要使用两次:
.html
通过在每个文件名末尾添加以下内容来重命名当前目录中的所有文件:mmv -v '*' '#1.html'
重新命名(恢复)所有之前名称中包含一个或多个
.
(点)的文件:mmv -v '*.*.html' '#1.#2'
或者,用一行代码:
mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'
-v
选项不是必需的。我仅将其用于详细输出,因为如果没有它,它mmv
会默默执行操作。
看man mmv
了解更多信息。
答案4
答案是完美的,我还给你另一个执行此项工作的命令:
ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh
一些解释:
ls - list directory contents
-1 list one file per line
grep prints the matching lines.
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v
is specified by POSIX.)
Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.
笔记 :
我尝试了您的场景并且命令完成了工作。