将文本追加到不包含点的文件名中


9

给定以下文件:

english_api
english_overview
style.css

我想得到:

english_api.html
english_overview.html
style.css

换句话说,如何.使用终端将文本附加到目录中不包含点()的所有文件。

显然,该文件夹中有很多文件。我只写了3个例子。

如果要在该文件夹中替换.css.html,我将使用:

rename .css .html *.css

但是我真的想不出一种方法来匹配不包含某些内容的文件。另外如何使用rename命令附加(与替换)?

Answers:


13

试试这个find命令

find . -type f ! -name "*.*" -exec mv {} {}.html \;

它将当前目录中文件名中不包含点的文件重命名为此filename.html格式(末尾添加.html)。

. ->代表当前目录

-type f ->仅对文件执行此操作。

! -name "*.*" ->打印名称中没有点的文件的名称。

-exec mv {} {}.html -> find命令对提取的文件名执行此move(或)rename操作。

\; ->表示find命令结束。


6

在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一旦确认与正确的模式匹配,请删除该选项)。


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done命令也重命名目录。
Avinash Raj 2014年

2

我喜欢这种情况mmv。它在Ubuntu中默认未安装,但是您可以使用sudo apt-get install mmvcommand 安装。

在您的情况下,您需要使用两次:

  1. 重命名当前目录中的所有文件,方法是.html在每个文件名的末尾添加:

    mmv -v '*' '#1.html'
    
  2. 再次(重命名)以前名称中包含一个或多个.(点)的所有文件:

    mmv -v '*.*.html' '#1.#2'
    

或者,一行:

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'

-v该选项不是强制性的。我仅将其用于详细输出,因为没有它,它mmv会默默地执行操作。

请参阅man mmv以获取更多信息。


1

使用Perl重命名命令(prename),可以添加条件,即文件名必须包含点。如果Perl片段未更改文件名,则该文件将保持不变。这里有几种写法:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

答案是完美的,我也给你另一个命令来完成这项工作:

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.

注意 :

我尝试您的方案,命令完成任务。


6
对于包含任何类型的空格(空格,制表符,换行符等)的文件名,此操作将失败。通常,您永远都不应解析ls
2014年

没错,terdon感谢您的评论,但是我该如何在同一命令中解决此问题
2014年

3
你真的不能。目前几乎没有安全的方式来解析LS。如果您确实想使用awk和进行操作sh,请尝试类似的操作printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh。这仍然会用换行符破坏文件名,但至少它可以处理空格。如果--文件名以开头,则需要-
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.