【发布时间】:2013-01-30 23:45:10
【问题描述】:
我有一个目录,其中包含一个扩展名(在本例中为 .txt)的文件,我想自动转换为另一种扩展名 (.md)。
是否有一个简单的终端单行程序可以用来将此目录中的所有文件转换为不同的文件扩展名?
或者我需要用正则表达式编写脚本吗?
【问题讨论】:
标签: macos terminal file-extension
我有一个目录,其中包含一个扩展名(在本例中为 .txt)的文件,我想自动转换为另一种扩展名 (.md)。
是否有一个简单的终端单行程序可以用来将此目录中的所有文件转换为不同的文件扩展名?
或者我需要用正则表达式编写脚本吗?
【问题讨论】:
标签: macos terminal file-extension
你可以这样使用:
for old in *.txt; do mv $old `basename $old .txt`.md; done
先复制一份!
【讨论】:
$old 应在此处用双引号括起来,以免造成严重破坏。编辑:整个`basename ...` 也是。
或者,您可以安装 ren(重命名)实用程序
brew install ren
ren '*.txt' '#1.md'
如果要重命名文件名中带有前缀或后缀的文件
ren 'prefix_*.txt' 'prefix_#1.md'
【讨论】:
ren 'prefix_*.txt' 'prefix_#1.md'
不需要终端...只需突出显示您要重命名的所有文件。右键单击并选择“重命名##项”,然后在“查找:”框中输入“.txt”,在“替换为:”框中输入“.md”。
【讨论】:
open . 然后执行此操作!容易得多。
执行此操作的首选 Unix 方式(是的,OS X 基于 Unix)是:
ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' | sh
如果设计使ls 循环遍历整个文件名列表,为什么还要循环使用for?你有管道,使用它们。您不仅可以使用命令创建/修改输出,还可以使用命令(对,即由命令创建的命令,这是 Unix 的发明者之一 Brian Kernighan 在 Unix 上最喜欢的),所以让我们来看看ls 和 sed 通过将管道移除到 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 的 脚本解释器。当然,它甚至适用于其中包含空格的文件名。
顺便说一句:每次您在 Terminal 中键入内容时,您都会创建一个脚本,即使它只是一个带有诸如 ls 或 date 之类的单词的单个命令。一切都在 Unix 中运行shell 始终是一个脚本/程序,它只是一些基于 ASCII 的流(在这种情况下是指令流,而不是数据流)。
要查看sh 正在执行的实际命令,只需在sh 之后添加一个-x 选项,它会在shell 中打开调试输出,因此您将看到每个mv 命令都以实际执行sed 编辑器脚本传递的参数(是的,脚本中的另一个脚本 :-))。
但是,如果您喜欢复杂性,您甚至可以使用awk,如果您喜欢安装其他程序来完成基本工作,则可以使用ren。我知道甚至有人愿意为这个简单的日常任务编写一个 50 行左右的 perl 脚本。
也许在 finder 中重命名文件更容易,但如果远程连接到 Mac(例如通过ssh),则根本无法使用 finder。这就是为什么 cmd 行仍然非常有用的原因。
【讨论】:
根据上面选择的最准确的答案,这里有一个可重用的 bash 函数:
function change_all_extensions() {
for old in *."$1"; do mv $old `basename $old ."$1"`."$2"; done
}
用法:
$ change_all_extensions txt md
(我无法弄清楚如何在对该答案的评论中获得干净的代码格式。)
【讨论】:
无需编写脚本,只需点击此命令即可
find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt' '{}.md'
【讨论】:
我遇到了类似的问题,文件最后被命名为 .gifx.gif,这在 OS X 中可以删除最后一个 .gif:
for old in *.gifx.gif; do
mv $(echo "$old") $(echo "$old" | sed 's/x.gif//');
done
【讨论】:
x?gif(例如maxsgift.gitx.git),这将修改比您预期的文件更多的文件。这是最好的:sed s/\.gif$//'.
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
【讨论】:
列表=ls
对于 $list 中的文件
做
newf=echo $file|cut -f1 -d'.'
echo "newf 是 $newf"
mv $文件 $newf.jpg
完成
【讨论】: