以下代码有什么问题?
name='$filename | cut -f1 -d'.''
目前我得到的是字面字符串$filename | cut -f1 -d'.'
,但如果我去掉引号就什么都得不到了。同时,输入
"test.exe" | cut -f1 -d'.'
在shell中可以得到我想要的输出结果test
。我已经知道$filename
已被指定了正确的值。我想做的是将文件名(不包括扩展名)分配给一个变量。
以下代码有什么问题?
name='$filename | cut -f1 -d'.''
目前我得到的是字面字符串$filename | cut -f1 -d'.'
,但如果我去掉引号就什么都得不到了。同时,输入
"test.exe" | cut -f1 -d'.'
在shell中可以得到我想要的输出结果test
。我已经知道$filename
已被指定了正确的值。我想做的是将文件名(不包括扩展名)分配给一个变量。
您还可以使用参数扩展:
$ filename=foo.txt
$ echo "${filename%.*}"
foo
basename
获取仅包括扩展名的文件名。否则,如果路径中只有一个点(例如path.to/myfile
或./myfile
),则它将在路径内部修剪;即使路径中没有点,它也会获取(例如,如果路径为path/to/myfile.txt
,则会获取path/to/myfile
):
$ filepath=path.to/foo.txt
$ echo "${filepath%.*}"
path.to/foo
$ filename=$(basename $filepath)
$ echo $filename
foo.txt
$ echo "${filename%.*}"
foo
请注意,如果文件名只以点开头(例如.bashrc
),它将删除整个文件名。
echo -n "This.File.Has.Periods.In.It.txt" | awk -F. '{$NF=""; print $0}' | tr ' ' '.' | rev | cut -c 2- | rev
。谢谢。 - user208145image.png.gz
? - Hawker65%.*
只会移除文件名中的最后一个扩展名;如果你想要移除所有扩展名,应该使用 %%.*
。 - chepnerfilename=./ihavenoextension
。 - jpmc26$ basename /home/jsmith/base.wiki .wiki
base
.wiki
并得到/home/jsmith/base
呢? - Gabriel Staplesdirname
结合使用,例如 file=/home/jsmith/base.wiki; echo $(dirname $file)/$(basename $file .wiki)
。 - jenabasename
专门为此而设计,我发现它可以做更多的事情。 - JL Peyret当你想在脚本/命令中执行一个命令时,应该使用命令替换语法$(command)
。
因此,你的行应该是
name=$(echo "$filename" | cut -f 1 -d '.')
代码说明:
echo
获取变量 $filename
的值并将其发送到标准输出cut
命令cut
将使用点号(也称为分隔符)作为定界符,将字符串切割成段,并通过 -f
选择要在输出中显示的段$()
命令替换将获取输出并返回其值name
的变量请注意,这会给出变量的部分,直到第一个句点 .
:
$ filename=hello.world
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello.hello.hello
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello
$ echo "$filename" | cut -f 1 -d '.'
hello
$()
代替。 - jordanm如果您的文件名包含一个点(不是扩展名中的那个点),请使用以下方法:
echo $filename | rev | cut -f 2- -d '.' | rev
filename=/tmp.d/foo
? - FedKad.profile
。 - FedKadbasename "$INPUT" | rev | cut -f 2- -d '.' | rev
,它可以完美地工作。 $INPUT
是文件名或路径。 - donvercety只使用 POSIX 内置的功能:
#!/usr/bin/env sh
path=this.path/with.dots/in.path.name/filename.tar.gz
# Get the basedir without external command
# by stripping out shortest trailing match of / followed by anything
dirname=${path%/*}
# Get the basename without external command
# by stripping out longest leading match of anything followed by /
basename=${path##*/}
# Strip uptmost trailing extension only
# by stripping out shortest trailing match of dot followed by anything
oneextless=${basename%.*}; echo "$oneextless"
# Strip all extensions
# by stripping out longest trailing match of dot followed by anything
noext=${basename%%.*}; echo "$noext"
# Printout demo
printf %s\\n "$path" "$dirname" "$basename" "$oneextless" "$noext"
打印演示:
this.path/with.dots/in.path.name/filename.tar.gz
this.path/with.dots/in.path.name
filename.tar.gz
filename.tar
filename
/home/user/.profile
这样的 path
会发生什么? - FedKad/home/user/.profile
这样的path
,变量$oneextless
和$noext
将变为空字符串;换句话说,“点文件”名称消失了。 - FedKadfile1=/tmp/main.one.two.sh
t=$(basename "$file1") # output is main.one.two.sh
name=$(echo "$file1" | sed -e 's/\.[^.]*$//') # output is /tmp/main.one.two
name=$(echo "$t" | sed -e 's/\.[^.]*$//') # output is main.one.two
使用任何您想要的。在这里,我假设最后一个跟随文本的 .
(点)是扩展名。
file1=/tmp.d/mainonetwosh
时会发生什么?sed表达式应该被替换为 's/\.[^./]*$//'
。 - FedKad#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}
输出:
/tmp/foo.bar.gz /tmp/foo.bar
file=/tmp.d/foo
会发生什么? - FedKadfullname=bridge.zip
echo ${fullname:r}
这很简单,干净利落且可以链接到一起以删除多个扩展名:
fullname=bridge.tar.gz
echo ${fullname:r:r}
它可以与其他类似的修饰符组合使用。
#!/bin/bash
filename=program.c
name=$(basename "$filename" .c)
echo "$name"
输出:
program
basename
。它在Ubuntu中默认存在,代码简单易懂,能处理大多数情况。pathfile="../space fld/space -file.tar.gz"
echo ${pathfile//+(*\/|.*)}
.
处去除扩展名,但在我们的 ..
路径中失败了。echo **"$(basename "${pathfile%.*}")"**
space -file.tar # I believe we needed exatly that
这里有一个重要的提示:
我在双引号内使用了双引号来处理空格。 由于文本中包含 $,单引号将无法通过。 Bash 不同寻常地读取“second "first" quotes”以进行扩展。
但是,你仍然需要考虑 .hidden_files
。
hidden="~/.bashrc"
echo "$(basename "${hidden%.*}")" # will produce "~" !!!
结果并非预期的 ""。为了让它发生,请使用 $HOME
或 /home/user_path/
因为 bash 是 "不寻常的",不会扩展 "~"(查找 bash BashPitfalls)。
hidden2="$HOME/.bashrc" ; echo '$(basename "${pathfile%.*}")'
basename $filename .exe
将执行相同的操作。 - mpebasename "$filename" .exe
。否则有空格的文件名会带来麻烦。 - Charles Duffy"${file#prestring}"
。 - Aron Hoogeveen