我需要写一个命令行,搜索当前目录及其所有子目录中所有以".sh "结尾的文件名(没有引号)。它应该只显示没有扩展名.sh的文件名。这是我的命令脚本。
#!/bin/bash
find . -not -name "*.sh" | sed -e 's/\..*$//'
我的命令脚本: 我的错误在哪里? 我怎样才能改变它,使它能用在像weird.sh.sh这样的文件上呢? 我的命令必须只打印所有文件的名称,除了带有.sh扩展名的文件。
$>./my_find_sh | cat -e
file1$
file2$
file3$
$>
使用 -不是 将会产生相反的效果,它将选择所有不以.sh结尾的文件。
要删除像...sh.sh.sh这样的文件,你必须使用 (\.sh)*$
因为 ()*
如果存在,则重复该模式
find . -name "*.sh" | sed -E 's/(\.sh)*$//'
如果你有
-rw-r--r-- 1 test2.sh
-rw-r--r-- 1 test3.sh
-rw-r--r-- 1 test4.sh.sh.sh.sh
-rw-r--r-- 1 text1.sh
并运行
find . -name "*.sh" | sed -E 's/(\.sh)*$//'
你得到
test2
test3
text1
test4
如果你只想删除一次".sh",那么就用这个。
find . -name "*.sh" | sed -E 's/\.sh$//'
将输出这个。
test2
test3
text1
test4.sh.sh.sh
检查代码
出于这个原因,我对文件有一个命名方案。 我总是在文件名中的任何扩展名前加上一个加号(+),这样我就可以用它作为剪切的分隔符。
echo test+.sh | cut -d'+' -f1
这将产生 "测试"。