如何使我的命令行在具有扩展名(.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”的文件上工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命令行在Macos上打包Chrome扩展程序?

如何检查熊猫数据框行在各个列中是不是具有某些值,可扩展性

如何通过命令行在pytest中传递参数

使用ftp命令'mput'导航到具有随机生成名称的文件夹

如何使用最佳约定规则使我的 Angular 5 应用程序按预期工作?

如何通过命令行在本地更新存储库[复制]