【问题标题】:How to remove directories in a list from two lists?如何从两个列表中删除列表中的目录?
【发布时间】:2021-11-15 16:06:38
【问题描述】:

我正在编写一个 c-shell 脚本,其中我在两个字符串中 grepping 两个不同的目录。我想删除相同的目录名称。我只想要两者之间的唯一目录,省略重复的目录。我对如何做到这一点有点困惑。

在 sta_views 和 pnr_views 字符串中有一些常见的目录。如上所示,我使用 ls -l 命令对它们都进行了 grepped 存储。现在我想做的是“首先我们可以遍历 sta_view 并检查它是否存在于 pnr_view 列表中,如果不存在,则将它们放在单独的列表中,如果是,则不要做任何事情”希望这有助于理解你我的问题。谢谢!

请告诉我这样做的方法,

set pnr_views = `(ls -l pnr/rep/signoff_pnr/ | grep '^d' | awk '{print $9}'\n)`
set sta_views = `(ls -l sta/rep/ | grep '^d' | grep -v common | grep -v signoff.all.SAVEDESIGN | awk '{print $9}'\n)`

foreach i ($sta_view) 
if [$i == $pnr_view] #just want to remove the list pnr_view from sta_view
then
echo ...
else 
 

此处sta_views 包含pnr_views 中存在的目录。如何从sta_views 中删除pnr_views 目录?

【问题讨论】:

标签: grep csh


【解决方案1】:

遍历第一个目录中的目录,并检查第二个目录中是否存在相同的条目。

foreach i ( pnr/rep/signoff_pnr/*/ )
  if ( -d sta/rep/"$i:h:t" ) then
    switch ("$i:h:t")
      case *'common'*:
      case *'signoff.all.SAVEDESIGN'*:
        breaksw
      default:
        echo sta/rep/"$i:h:t"
        breaksw
    endsw
  endif
end

Csh 变量修饰符$i:h 返回$i 中文件名的目录名部分,而修饰符:t 返回其中的最后一个元素。

Csh 变化无常,因此现在相当不受欢迎。如果您切换到与 Bourne 兼容的现代 shell,您可能会有更好的运气,特别是如果您只是在学习。另见Csh considered harmfulhttps://www.shlomifish.org/open-source/anti/csh/ 上的其他链接。 Looping over pairs of values in bash 展示了如何在 Bash 中做类似的事情。

【讨论】:

  • 如果这解决了您的问题,请考虑接受它。或者,您可以发布自己的答案并接受。接受答案通过将问题标记为已解决来帮助未来的访问者。另见help.
猜你喜欢
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 2022-12-20
  • 2021-05-24
相关资源
最近更新 更多