如何使用脚本从文件中删除未知文件扩展名

时间:2017-01-12 00:22:43

标签: shell csh tcsh

如果我知道扩展名,我可以删除文件扩展名,例如从文件中删除.txt:

foreach file (`find . -type f`)
    mv $file `basename $file .txt`
end

但是,如果我不知道开始使用哪种文件扩展名,我该怎么做?

我试过了:

foreach file (`find . -type f`)
mv $file `basename $file .*`
end

但它不起作用。

4 个答案:

答案 0 :(得分:2)

您可以使用sed来计算基本文件名。

foreach file (`find . -type f`)
    mv $file `echo $file | sed -e 's/^\(.*\)\.[^.]\+$/\1/'`
end

答案 1 :(得分:2)

要小心:您试图运行的命令可能会导致数据丢失!

如果您认为您的文件名不包含换行符或双引号,则可以使用:

find . -type f -name '?*.*' |
sed 's/\(.*\)\.[^.]*$/mv "&" "\1"/' |
sh

这将生成您的文件列表(确保名称至少包含一个字符加.),通过sed脚本运行每个文件名,将其转换为{{1}通过有效地从最后mv开始删除材料,然后通过shell运行命令流来执行命令。

显然,您首先通过省略.部分来测试它。考虑使用| sh运行它以了解shell正在做什么。请考虑确保将shell的输出,标准输出和标准错误捕获到日志文件中,以便记录发生的损坏。

确保在开始播放之前,您已经备份了原始文件集。它只需要存储在目录层次结构的不同部分中的| sh -x文件,只要您对结果感到满意,就可以将其删除。

你可以选择任何外壳;这并不依赖于任何shell构造,除了管道和单引号和双引号(所有shell都很常见),tar脚本也是版本中立的。

请注意,如果您在运行此文件之前有sedxyz.c文件,则之后只会有一个文件xyz.h(其中包含的文件取决于订单中的顺序)处理文件,不需要按字母顺序排列。

如果您认为您的文件名可能包含双引号(但不包含单引号),则可以使用更改xyz脚本中的引号。如果您可能需要处理这两个问题,则需要更复杂的sed脚本。如果你需要处理文件名中的换行符,那么是时候(a)告诉你的用户不要傻了,(b)修改名字,这样他们就不会包含换行符。然后你可以使用上面的脚本。如果这不可行,您必须更加努力地工作批次以准确完成工作 - 您可能需要确保您已获得sed支持find,支持-print0的{​​{1}}和支持sed的{​​{1}}(如果您还没有支持-z,请安装最新的GNU版本正确的支持)。

答案 2 :(得分:1)

这是什么外壳?至少在bash中你可以做到:

find . -type f | while read -r; do
    mv -- "$REPLY" "${REPLY%.*}"
done

(通常的警告适用:这不会处理名称中包含换行符的文件。)

答案 3 :(得分:1)

这很简单:

$ set filename=/home/foo/bar.dat
$ echo ${filename:r}
/home/foo/bar

在“{3}}中查看”历史记录替换“中的详情:

  

[R

     

删除文件扩展名“.xxx”,保留根名称。