Bash 处理类似(但不同)命名目录中的文件
我有2个文件,需要在上面运行各种命令。这两个文件的名称完全相同,但位于不同的文件夹中。问题在于文件夹名。在文件夹方面,我可以依靠这些东西: 1) 通向文件夹的路径将始终相同 2) 第一个文件夹的名称中始终包含一个连字符 a。在此之前,所有服务器上的第一个连字符都是相同的 b。在第一个连字符之后,不同服务器之间的连字符将不同,但在同一服务器上相同(类似于servername,但并不总是特别指定servername) 3) 第二个文件夹将始终包含与第一个文件夹相同的名称,但带有第二个连字符和另一组随机字符 下面是一个更直观的细分:Bash 处理类似(但不同)命名目录中的文件,bash,shell,Bash,Shell,我有2个文件,需要在上面运行各种命令。这两个文件的名称完全相同,但位于不同的文件夹中。问题在于文件夹名。在文件夹方面,我可以依靠这些东西: 1) 通向文件夹的路径将始终相同 2) 第一个文件夹的名称中始终包含一个连字符 a。在此之前,所有服务器上的第一个连字符都是相同的 b。在第一个连字符之后,不同服务器之间的连字符将不同,但在同一服务器上相同(类似于servername,但并不总是特别指定servername) 3) 第二个文件夹将始终包含与第一个文件夹相同的名称,但带有第二个连字符和另一组随
Server01
/same/fld/path/dir1/
|
+--same-nameX/
| |
| +--sameFileName
|
+--same-nameX-abc123/
|
+--sameFileName
Server02
/same/fld/path/dir1/
|
+--same-nameY/
| |
| +--sameFileName
|
+--same-nameY-a1b2c3/
|
+--sameFileName
我正在用bash编写脚本,并且我正在尝试编写一个无论在哪个服务器上运行都能正常工作的脚本
所以我的问题是,我如何制定bash命令(为了简单起见,“cat”),使其在一个文件上权威地工作,而不是在另一个文件上
例如,这:
cat /same/fld/path/dir1/same-*-*/sameFileName
这肯定会给我“same-nameX-abc123/sameFileName”的内容
然而,这:
cat /same/fld/path/dir1/same-*/sameFileName
这将不起作用,因为它将影响两个文件,并且我想特别处理文件“../same nameX/sameFileName”
任何帮助都将不胜感激
为了更加清楚,这个问题与只有一个字符差异的文件夹名称无关。它与明显不同的文件夹有关,但区别在于“连字符”之间。以下是一些例子:
Server03
/same/fld/path/dir1/same-zxy12/sameFileName
/same/fld/path/dir1/same-zxy12-xYz/sameFileName
Server04
/same/fld/path/dir1/same-g1f2e3d4/sameFileName
/same/fld/path/dir1/same-g1f2e3d4-ab12c345/sameFileName
Server05
/same/fld/path/dir1/same-nmo/sameFileName
/same/fld/path/dir1/same-nmo-ab/sameFileName
再次感谢大家的知识。我建议在您的每个案例中使用扩展glob来匹配第一个文件:
shopt -s extglob # enable extended globbing
cat /same/fld/path/dir1/same-!(*-)/sameFileName
此模式将匹配任何不包含另一个
-
的目录名。我认为您可以尝试使用如下字符范围:
cat/same/fld/path/dir1/same name[a-zA-Z$]/sameFileName
这个答案目前的编写方式听起来像是一个注释。您能否将您的答案说得更具体一些,或者提供有关cat
命令功能的其他信息?我尝试了您的答案,但据我所知,[a-zA-Z$]只是对最后一个字符的测试,以确保它是字母(小写或大写)。我的需求不是基于单个字符,而是缺少辅助连字符。我试过“cat/same/fld/path/dir1/same-[:alnum:]/sameFileName”,但这也没用。@RussNS[a-zA-Z$]
表示一个字母或字符本身。这并不意味着行的结束,因为它在括号内。使用“cat/same/fld/path/dir1/same-!(*-*)/sameFileName”进行测试可能有一种方法可以绕过它,而不使用extglob,但您可以始终以相同的方式在交互式shell中启用它,因此这将是我的建议。