如何使我的命令行在具有扩展名(.sh)和名称如“weird.sh.sh.sh”的文件上工作
Posted
技术标签:
【中文标题】如何使我的命令行在具有扩展名(.sh)和名称如“weird.sh.sh.sh”的文件上工作【英文标题】:How to make my command line work on files which have extention(.sh) and name like "weird.sh.sh.sh" 【发布时间】:2020-09-22 13:32:36 【问题描述】:我需要编写一个命令行来搜索当前目录及其所有子目录中所有以“.sh”(不带引号)结尾的文件名。它应该只显示不带扩展名 .sh 的文件名。 这是我的命令脚本:
#!/bin/bash
find . -not -name "*.sh" | sed -e 's/\..*$//'
我的错误在哪里? 如何更改它以使用带有扩展名 .sh 的怪异.sh.sh.sh 之类的文件 我的命令必须只打印除具有 .sh 扩展名的文件之外的所有文件的名称。 示例:
$>./my_find_sh | cat -e
file1$
file2$
file3$
$>
【问题讨论】:
请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。 你想在这里达到什么目的?find -not -name '*.sh'
排除任何与*.sh
匹配的内容。
【参考方案1】:
使用 -not 将使相反,它将选择所有不以 .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
检查代码
【讨论】:
我需要显示所有没有“.sh”扩展名的文件。是否可以使用命令:find、rev、cut、sed? @Blazing_Sun 你测试过解决方案吗? 它不应该删除 "sh" -rw-r--r-- 1 test4.sh.sh.sh.sh 输出:test4.sh.sh.sh 你说的很不清楚。你希望它删除一个 ".sh" ,而不是每一个? 是的,只有一个。【参考方案2】:出于这个原因,我有一个文件命名方案。我总是在文件名的任何扩展名前加上一个加号 (+),这样我就可以将它用作带有剪切的分隔符。
echo test+.sh | cut -d'+' -f1
这将产生“测试”。
【讨论】:
以上是关于如何使我的命令行在具有扩展名(.sh)和名称如“weird.sh.sh.sh”的文件上工作的主要内容,如果未能解决你的问题,请参考以下文章