Answers:
试试这个find
命令
find . -type f ! -name "*.*" -exec mv {} {}.html \;
它将当前目录中文件名中不包含点的文件重命名为此filename.html
格式(末尾添加.html
)。
.
->代表当前目录
-type f
->仅对文件执行此操作。
! -name "*.*"
->打印名称中没有点的文件的名称。
-exec mv {} {}.html
-> find
命令对提取的文件名执行此move(或)rename操作。
\;
->表示find
命令结束。
在bash中,您可以使用扩展的shell glob,例如
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done
(echo
一旦您确认它与正确的模式匹配,就将其删除)。如果尚未启用扩展的globing,则可以使用启用它shopt -s extglob
。
另一个选择是将基于Perl的rename
函数与不包含文字的正则表达式一起使用.
rename -nv 's/^[^.]+$/$&.html/' path/to/files/*
(n
一旦确认与正确的模式匹配,请删除该选项)。
我喜欢这种情况mmv
。它在Ubuntu中默认未安装,但是您可以使用sudo apt-get install mmv
command 安装。
在您的情况下,您需要使用两次:
重命名当前目录中的所有文件,方法是.html
在每个文件名的末尾添加:
mmv -v '*' '#1.html'
再次(重命名)以前名称中包含一个或多个.
(点)的所有文件:
mmv -v '*.*.html' '#1.#2'
或者,一行:
mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'
-v
该选项不是强制性的。我仅将其用于详细输出,因为没有它,它mmv
会默默地执行操作。
请参阅man mmv
以获取更多信息。
使用Perl重命名命令(prename
),可以添加条件,即文件名必须包含点。如果Perl片段未更改文件名,则该文件将保持不变。这里有几种写法:
prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
答案是完美的,我也给你另一个命令来完成这项工作:
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.
注意 :
我尝试您的方案,命令完成任务。
ls
。
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done
命令也重命名目录。