我想分别获取文件名(不带扩展名)和扩展名。
到目前为止,我找到的最佳解决方案是:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
这是错误的,因为如果文件名包含多个,它就不起作用。字符。假设我有a.b.js,它会考虑a和b.js而不是a.b和js。
它可以在Python中用
file, ext = os.path.splitext(path)
但如果可能的话,我不希望仅仅为此启动Python解释器。
有更好的主意吗?
一个简单的答案:
要扩展POSIX变量答案,请注意您可以执行更多有趣的模式。因此,对于此处详述的案例,您可以简单地执行以下操作:
tar -zxvf $1
cd ${1%.tar.*}
这将切断.tar.<something>的最后一次出现。
更一般地,如果要删除最后一次出现的<一些><其他>然后
${1.*.*}
应该工作正常。
上述答案的链接似乎已失效。这是一个很好的解释,可以直接在Bash中使用TLDP进行一系列字符串操作。
为了使dir更有用(在没有指定路径的本地文件作为输入的情况下),我执行了以下操作:
# Substring from 0 thru pos of filename
dir="${fullpath:0:${#fullpath} - ${#filename}}"
if [[ -z "$dir" ]]; then
dir="./"
fi
这允许您执行一些有用的操作,如在输入文件basename中添加后缀,如下所示:
outfile=${dir}${base}_suffix.${ext}
testcase: foo.bar
dir: "./"
base: "foo"
ext: "bar"
outfile: "./foo_suffix.bar"
testcase: /home/me/foo.bar
dir: "/home/me/"
base: "foo"
ext: "bar"
outfile: "/home/me/foo_suffix.bar"
一个简单的bash一行。我用这个从pwd中的所有文件中删除rst扩展名
for each in `ls -1 *.rst`
do
a=$(echo $each | wc -c)
echo $each | cut -c -$(( $a-5 )) >> blognames
done
它做什么?
1) ls-1*.rst将在新行中列出stdout上的所有文件(try)。
2) echo$each|wc-c统计每个文件名中的字符数。
3) echo$each|cut-c-$(($a-5))最多选择最后4个字符,即.rst。