如果我知道扩展名,我可以删除文件扩展名,例如从文件中删除.txt:
foreach file (`find . -type f`)
mv $file `basename $file .txt`
end
但是,如果我不知道开始使用哪种文件扩展名,我该怎么做?
我试过了:
foreach file (`find . -type f`)
mv $file `basename $file .*`
end
但它不起作用。
答案 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
脚本也是版本中立的。
请注意,如果您在运行此文件之前有sed
和xyz.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”,保留根名称。