Linux~ / .bashrc导出最近的目录

时间:2015-11-11 14:27:01

标签: linux bash directory

我的〜/ .bashrc中有几个环境变量指向不同的目录。我正在运行一个程序,每次运行时都会创建一个新文件夹,并在目录名中加上一个时间戳。例如,baseline_2015_11_10_15_40_31-model-stride_1-type_1。是否有可能链接到最后创建的目录的变量?

cd $CURRENT_DIR

1 个答案:

答案 0 :(得分:1)

您的里程可能会有很大差异,具体取决于您需要完成的工作。但是,几乎所有情况下我都建议不要像下面描述的那样做一些奇怪和不可靠的事情,并修改你的架构以避免搜索目录。

方法1

如果您的程序在当前目录中创建了一个子目录,并且您始终知道该目录中没有其他任何内容发生,而您想要一个具有最新创建时间戳的子目录,那么您可以执行以下操作:

your_complex_program_that_creates_dir
TARGET_DIR=$(ls -t1 --group-directories-first | head -n1)
cd "$TARGET_DIR"

方法2

如果系统上发生了很多事情,那么您最终会监视程序对文件系统的作用,并在创建目录时做出反应。有两种方法可以做到这一点,使用straceinotify,两者都比较复杂。这是使用strace做到这一点的方法:

strace -o some_temp_file.strace your_complex_program_that_creates_dir
TARGET_DIR=$(sed -ne '/^mkdir(/ { s/^mkdir("\(.*\)", .*).*$/\1/; p }' some_temp_file.strace
cd "$TARGET_DIR"

此代码段在your_complex_program_that_creates_dir的控制下运行strace,这实际上会将您程序生成的每个系统调用记录到文件中。然后,分析此文件以寻找类似

的行
mkdir("target_dir", 0777)                       = 0

并将"target_dir"的值提取到变量中。请注意:

  1. 如果您的程序创建了多个目录(即使是出于临时目的并在之后将其删除,或其他任何目的) - 那么确实无法确定要抓取哪个目录
  2. 由于记录所有系统调用的巨大开销,运行strace的程序比正常情况慢。
  3. 它的超级非便携式 - 大多数现代操作系统都存在strace等设施,但实施方式会有很多很多
  4. inotify的解决方案以相同的方式工作,但使用不同的机制 - 即它使用OS挂钩记录进程对文件系统执行的所有操作,然后对其做出反应(记住创建的目录)。 / p>

    但是,我再说一遍,我强烈建议不要使用任何超出研究兴趣的解决方案。