2013-02-15 169 views
47

我有一个目录,其中包含一个扩展名(.txt)的文件,我想要自动转换为另一个扩展名(.md)。更改目录中所有文件的文件扩展名OSX

是否有一个简单的终端一个班轮我可以用来将此目录中的所有文件转换为不同的文件扩展名?

或者我需要写一个正则表达式的脚本?

回答

101

你可以使用这样的事情:

for old in *.txt; do mv $old `basename $old .txt`.md; done 

先做一个副本!

+0

是的,似乎这样做。谢谢 – 2013-02-15 02:56:44

+4

在小牛队,这不适合我,给这个输出: 用法:mv [-f | -i | -n] [-v]源目标 mv [-f | -i | -n] [-v]源...目录 – 2013-12-30 23:32:25

+1

刚刚在小牛队尝试过,它工作正常。这假定你正在使用bash,默认的shell。 – 2013-12-31 04:19:30

0
cd $YOUR_DIR 
    ls *.txt > abc 
    mkdir target // say i want to move it to another directory target in this case 
    while read line 
    do 
    file=$(echo $line |awk -F. '{ print $1 }') 
    cp $line target/$file.md // depends if u want to move(mv) or copy(cp) 
    done < abc 
35

终端不是必需的...只需突出显示所有要重命名的文件。右键单击并选择“Rename ## items”,然后在“Find:”框中输入“.txt”,在“Replace with:”框中输入“.md”。

+0

从来不知道这一点 - 谢谢! – 2015-02-11 21:43:59

+1

是的。这很好。在终端:“打开”,然后执行此操作!更容易。 – 2015-11-09 13:19:08

+1

哇!从来不知道这个! – n13 2016-04-28 01:27:44

42

或者,如果你想根据选择的,最准确的答案

ren 'prefix_*.txt' 'prefix_#1.md' 
+3

这是命令行重命名文件的最佳建议。谢谢! – Emmanuel 2015-03-02 20:32:23

+1

如果你想重命名文件名前缀或后缀的文件,你可以使用'ren'前缀_ * .txt''prefix_#1.md'' – Raptor 2016-10-07 10:22:31

+0

谢谢@Raptor,已更新! – Renaud 2016-10-11 15:00:14

4

在文件名重命名前缀或后缀的文件,你可以安装ren(重命名)实用程序

brew install ren 

ren '*.txt' '#1.md' 

以上是可重用性的bash函数:

function change_all_extensions() { 
    for old in *."$1"; do mv $old `basename $old ."$1"`."$2"; done 
} 

用法:

$ change_all_extensions txt md 

(我无法弄清楚如何获得干净的代码,在这个问题的答案评论格式化)

2

的首选Unix的方式做到这一点(是的,OS X是基于Unix的)是:

ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' | sh

为什么用for循环,如果ls设计遍历文件名的整个名单?你有管道,使用它们。你不仅可以创建/修改使用命令的输出,而且可以使用命令创建/修改命令(正确的,这是命令创建的命令,这是Unix的发明人之一Brian Kernighan在Unix上最喜欢的),让我们来看看在lssed产生通过移除管道sh

$ ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' 
mv "firstfile.txt" "firstfile.md" 
mv "second file.txt" "second file.md" 
$ 

正如你所看到的,它不仅是一个内胆,而是一个完整的脚本,其中还通过创建另一个脚本输出工作。因此,让我们将由单线程脚本生成的脚本提供给sh,即,脚本解释器OS X.当然,它甚至适用于包含空格的文件名。

BTW:每次你在终端类型的东西时,你创建一个脚本,哪怕是只有一个命令像lsdate等一切都运行一个字在Unix shell始终是一个脚本/程序,这只是一些基于ASCII的流(在这种情况下,指令流与数据流相反)。

要看到实际的命令被sh执行,只需添加sh-x选项,这将在壳调试输出,所以你会看到每一个mv命令正在由sed编辑脚本传递的实际参数执行(是的,脚本内的另一个脚本:-))。

但是,如果您喜欢复杂性,您甚至可以使用awk,如果您想安装其他程序来完成基本工作,则有ren。我甚至知道,为了这个简单的每日任务,人们更愿意写50行左右的perl脚本。

也许重新命名文件可能更容易找到,但如果远程连接到Mac(例如通过ssh),使用查找器根本不可能。这就是为什么cmd行仍然非常有用。

+0

这很好地工作 - 做递归,改变'ls'为'找到。-name“* .txt”' – 2017-12-27 12:56:27

1

无需编写脚本,针对它只是打这个命令

find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt' '{}.md' 
1

我有哪里文件被命名为.gifx.gif在结束了类似的问题,这曾在OS X中删除最后.gif

for old in *.gifx.gif; do 
    mv $(echo "$old") $(echo "$old" | sed 's/x.gif//'); 
done 
+0

如果名称中任何位置有'x?gif'(例如,'maxsgift.gitx.git'),这将修改比您想要的更多的文件。这是最好的:'sed s/\ .gif $ //''。 – giusti 2017-01-14 14:44:29

0

对于那些不擅长编程的人,你可以查看wiki how这篇文章。
它显示了许多不涉及编码
的方法,您也可以在changing file extensions上查看此博客帖子。
它包含一个控制台应用程序,为您做所有的事情。