basename命令是一个标准的Unix和类Unix系统上的程序。它的作用是从给定的文件名或路径名中删除任何前导的目录信息和后缀,只返回文件名的最后一部分。basename命令主要用于shell脚本中,可以方便地提取文件名或路径名的基本部分。
basename命令是一个通用的命令,适用于几乎所有的Linux版本,包括Ubuntu, CentOS, Debian, Fedora等。如果你的Linux系统没有安装basename命令,你可以使用以下命令来安装:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install coreutils
[linux@bashcommandnotfound.cn ~]$ sudo yum install coreutils
[linux@bashcommandnotfound.cn ~]$ sudo pacman -S coreutils
basename命令的基本语法格式有两种:
basename NAME [SUFFIX]
basename OPTION... NAME...
其中,NAME表示文件名或路径名,SUFFIX表示要删除的后缀,OPTION表示basename命令支持的选项。
basename命令支持的选项或参数有以下几个:
选项 | 参数 | 说明 |
---|---|---|
-a | –multiple | 支持多个输入,将每个输入都视为一个NAME |
-s | –suffix=SUFFIX | 删除一个后缀SUFFIX,如文件扩展名 |
-z | –zero | 用NUL而不是换行符来分隔输出 |
–help | 无 | 显示帮助信息并退出 |
–version | 无 | 显示版本信息并退出 |
以下是一些使用basename命令的实例,结合了一些常见的搜索关键词。
如果你只想获取文件名,而不需要路径名,你可以使用basename命令来删除路径名,例如:
[linux@bashcommandnotfound.cn ~]$ basename /etc/passwd
passwd
这个命令会输出文件名passwd,而不包含/etc/目录。
如果你想获取文件名,但不需要文件扩展名,你可以使用basename命令来删除文件扩展名,例如:
[linux@bashcommandnotfound.cn ~]$ basename /etc/sysctl.conf .conf
sysctl
这个命令会输出文件名sysctl,而不包含.conf扩展名。你也可以使用-s选项来指定要删除的后缀,例如:
[linux@bashcommandnotfound.cn ~]$ basename -s .conf /etc/sysctl.conf
sysctl
这个命令和上一个命令的效果是一样的。
如果你想一次处理多个文件名或路径名,你可以使用-a选项来支持多个输入,例如:
[linux@bashcommandnotfound.cn ~]$ basename -a /etc/passwd /etc/shadow
passwd
shadow
这个命令会输出两个文件名,分别是passwd和shadow,每个文件名占一行。
如果你想在shell脚本中使用basename命令来重命名文件,你可以结合mv命令来实现,例如,以下是一个shell脚本,它可以将当前目录下所有的.jpeg文件的扩展名改为.jpg:
#!/bin/sh
for file in *.jpeg; do
#退出如果没有文件
if [ ! -f $file ]; then
exit
fi
b=$(basename $file .jpeg)
echo NOW $b.jpeg is $b.jpg
mv -- "$file" "$(basename $file .jpeg).jpg"
done
这个脚本会遍历当前目录下的所有.jpeg文件,使用basename命令来提取文件名的基本部分,然后使用mv命令来重命名文件,并输出重命名的结果。
使用basename命令时,有以下几点需要注意:
[linux@bashcommandnotfound.cn ~]$ basename /usr/local/
local
这个命令会输出local,而不是空字符串。
[linux@bashcommandnotfound.cn ~]$ basename /etc/sysctl.conf.dpkg-dist .dpkg-dist
sysctl.conf
[linux@bashcommandnotfound.cn ~]$ basename $(basename /etc/sysctl.conf.dpkg-dist .dpkg-dist) .conf
sysctl
这个命令会先删除.dpkg-dist后缀,再删除.conf后缀,最后输出sysctl。
bash: basename: command not found
这时,你需要根据你的Linux版本,使用相应的安装命令来安装coreutils包,如前面所述。
更多详细内容可以参考:
linux入门学习教程 - Linux入门自学网
Linux mesg命令详解:如何控制终端消息权限(附实例教程和注意事项)