【问题标题】:Adding search and replace to the "cd" command在“cd”命令中添加搜索和替换
【发布时间】:2018-03-25 22:40:56
【问题描述】:

我正在尝试找出一种在命令行中搜索和替换的方法。该解决方案最好在 tcsh 中运行。这就是我想做的事情。

$ echo $PWD
/projects/apples/001/0440/my/files/are/here/
$ cd 0999
/projects/apples/001/0999/my/files/are/here/
$ cd oranges
/projects/oranges/001/0999/my/files/are/here/
$ cd were
/projects/oranges/001/0999/my/files/were/here/

脚本将从行尾开始搜索并找到匹配目录结构的第一个匹配项,然后 cd 进入该目录。

我精通python,用这种语言编写这个脚本很容易,但是python在一个进程中运行,因此更改一个进程的当前目录对其他现有进程的当前工作目录没有影响。

编写这样一个脚本的最佳方法是什么?完成这项任务的最有效方法是什么?我的目录结构可能会变得非常大,包含数千个文件夹,因此需要快速。

【问题讨论】:

  • 编写你提到的python程序,但让它打印出目录名称而不是尝试更改cwd。然后,您可以使用 tcsh 等效于以下 sh 命令:cd "$( prog.py )"
  • - 显然您可以创建一个名为 cd 的 shell 函数来为您执行此操作,以便您每次都可以编写 cd 0999 而不是 cd "$(myprog 0999)"
  • 选择一个外壳。如果您想要一个 tcsh 答案,请不要标记 bash ——它们完全和完全不兼容。
  • 顺便说一句,在 bash 中这样的实现可能看起来像 cd() { command cd "$@"; local subdir; IFS= read -r -d '' subdir < <(find . -name here -type d -print0 -exit); [[ $subdir ]] && cd "$subdir"; } -- 尽管我强烈、强烈强烈建议不要这样做.这样做会破坏很多的脚本和习语,并且在切换到下面有深层结构的目录时运行速度也会非常慢。

标签: bash perl replace tcsh cd


【解决方案1】:

example.py 是一个输出一些shell 命令的脚本。

#!/usr/bin/python
# example.py
print("cd foo/bar/baz")

然后您可以在当前 shell 中使用反引号或 $(...) 表示法执行该脚本的输出。

mob ~ $ $(./example.py)
mob ~/foo/bar/baz $ echo $PWD
mob ~/foo/bar/baz $ /home/mob/foo/bar/baz

【讨论】:

  • 如果您使用print("foo/bar/baz") 而不是print("cd foo/bar/baz"),则更灵活。这也使得处理名称中带有空格的目录变得更加容易。
  • ...否则,如果要正确处理有趣的目录名(包括带有空格、语法等的目录名),则需要使用pipes.quote(),并确保周围的shell 包含eval .这会转义 POSIX-y shell 的内容;如果 OP 认真想要一个 csh 答案,那将是一组完全不同的问题。
猜你喜欢
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2021-05-13
  • 2016-12-12
  • 2023-02-01
  • 1970-01-01
相关资源
最近更新 更多