要从BASH变量的末尾删除字符串,请使用${var%ending}语法.这是BASH中可用的许多字符串操作之一.
像这样使用它:
# Run in the same directory as the files
for FILENAME in *.bak; do mv "$FILENAME" "${FILENAME%.bak}"; done
Run Code Online (Sandbox Code Playgroud)
这可以很好地作为一个单行,但你也可以将其包装为一个脚本,以在任意目录中工作:
# If we're passed a parameter, cd into that directory. Otherwise, do nothing.
if [ -n "$1" ]; then
cd "$1"
fi
for FILENAME in *.bak; do mv "$FILENAME" "${FILENAME%.bak}"; done
Run Code Online (Sandbox Code Playgroud)
请注意,虽然引用变量几乎总是一个好习惯,但for FILENAME in *.bak如果您的任何文件名可能包含空格,则仍然很危险.阅读David W.对更强大的解决方案的回答,以及替代解决方案的本文档.
有几种方法可以删除文件后缀:
在BASH和Kornshell中,您可以使用环境变量过滤.搜索${parameter%word}在BASH 手册页的完整信息.基本上,#是一个左过滤器,%是一个右过滤器.你可以记住这个,因为#在左边%.
如果您使用双重过滤器(即##或者%%,您尝试过滤最大匹配.如果您有一个过滤器(即#或者%,您尝试过滤最小的匹配).
筛选出哪些匹配项,您将获得其余字符串:
file="this/is/my/file/name.txt"
echo ${file#*/} #Matches is "this/` and will print out "is/my/file/name.txt"
echo ${file##*/} #Matches "this/is/my/file/" and will print out "name.txt"
echo ${file%/*} #Matches "/name.txt" and will print out "/this/is/my/file"
echo ${file%%/*} #Matches "/is/my/file/name.txt" and will print out "this"
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个glob匹配而不是正则表达式匹配!如果要删除文件后缀:
file_sans_ext=${file%.*}
Run Code Online (Sandbox Code Playgroud)
在.*将匹配期间和之后的所有字符.由于它是单个的%,它将匹配字符串右侧的最小的glob.如果过滤器无法匹配任何内容,则它与原始字符串相同.
您可以使用以下内容验证文件后缀:
if [ "${file}" != "${file%.bak}" ]
then
echo "$file is a type '.bak' file"
else
echo "$file is not a type '.bak' file"
fi
Run Code Online (Sandbox Code Playgroud)
或者你可以这样做:
file_suffix=$(file##*.}
echo "My file is a file '.$file_suffix'"
Run Code Online (Sandbox Code Playgroud)
请注意,这将删除文件扩展名的句点.
接下来,我们将循环:
find . -name "*.bak" -print0 | while read -d $'\0' file
do
echo "mv '$file' '${file%.bak}'"
done | tee find.out
Run Code Online (Sandbox Code Playgroud)
该find命令将查找您指定的文件.该-print0分离出一个NUL符号的文件的名称-这是一个文件名,不允许少数人物之一.该-d $\ 0 means that your input separators are NUL symbols. See how nicely the找到-print0 and读-d $'\ 0'`在一起吗?
你几乎不应该使用这种for file in $(*.bak)方法.如果文件名称中有任何空格,则会失败.
请注意,此命令实际上不会移动任何文件.相反,它会生成一个find.out包含所有文件重命名列表的文件.当你执行操作大量文件的命令时,你应该总是做这样的事情,以确保一切正常.
一旦确定所有命令find.out都正确,就可以像shell脚本一样运行它:
$ bash find.out
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7589 次 |
| 最近记录: |