有什么方法在bash中判断一个目录是新的还是旧的?

时间:2014-12-26 21:02:23

标签: git bash

我有一个基本的脚本:

set -eux

# We need directories set up.
mkdir -p ~/vagrant/Freya-Factory
mkdir -p ~/vagrant/Freya-Http
mkdir -p ~/vagrant/Freya-Loader
mkdir -p ~/vagrant/Freya-Loader-Assets
mkdir -p ~/vagrant/Freya-Templates

for f in *; do
  if [[ -d $f ]]; then
    cd "$f/"
    git init
    read -e -p "Please enter email for git --global user.email: " email
    git config --global user.email "$email"
    read -e -p "Please enter name for git --global user.name: " name
    git config --global user.email "$name"
    cd ../
  fi
done

它会cd进入每个创建的目录并询问您的问题并使用这些答案然后设置git相关信息。

但是这里抓住了。我只想将cd放到目录中,如果导演是新的,那么就完成所有这些操作。但我不确定如何检查。

在bash中有没有办法说,如果这个目录刚刚创建了x,否则就是

更新

在过去1分钟内创建的新方法。

2 个答案:

答案 0 :(得分:5)

如果它是“new”,而不是进入目录, 如果它不是Git存储库,也许更好的条件是输入。 在任何情况下,git init在Git存储库中都没有意义, 这清楚地说明了你对“新”定义的困境。

for f in */; do
  if [[ -d $f ]] && [[ ! -d $f/.git ]]; then
    cd "$f/"
    git init
    read -e -p "Please enter email for git --global user.email: " email
    git config --global user.email "$email"
    read -e -p "Please enter name for git --global user.name: " name
    git config --global user.email "$name"
    cd ../
  fi
done

其实我建议像这样重写:

git_init() {
    git init
    read -e -p "Please enter email for git --global user.email: " email
    git config --global user.email "$email"
    read -e -p "Please enter name for git --global user.name: " name
    git config --global user.email "$name"
}

shopt -s nullglob
for f in */; do
  if [[ ! -d $f/.git ]]; then
    (cd "$f/" && git_init)
  fi
done

改进:

  • 在脚本中使用cd很脆弱,因为您可能会忘记cd ..。通过将cd包裹在(...)中,您不需要记住,因为它是一个子shell,目录更改不会影响父(当前)进程
  • glob */仅匹配目录,因此不需要在循环内进行目录检查。更简单,更有效率
  • shopt -s nullglob是为了避免没有目录的情况。如果没有要匹配的目录,*/将不会被展开,它将被逐字地使用,这将导致错误。这是删除is-directory检查的必要条件

答案 1 :(得分:1)

最好是你有一个参考文件或目录,比如$ reference,来比较 - 比$ reference更新的东西被认为是新的。

function birth()
{
   stat -c '%Y' "$1"
}

if [ `birth "$dir"` -gt `birth "$reference"` ]
then
   echo "$dir" is new
else
   echo "$dir" is old
fi

'%Y'返回修改时间。其他时候,请参阅man stat。

请注意这不完全准确的事实 - 如果$ dir和$ reference上次在同一秒内被修改,$ dir被认为是旧的。如果您需要更精确的比较,发现可以帮助您,但它的工作量更大。

将您的最新评论纳入您自己的问题,我也建议:

function birth()
{
   stat -c '%Y' "$1"
}

now=`date '+%s'`
old=$((now-60))

if [ `birth "$dir"` -gt $old ]
then
   echo "$dir" is new
else
   echo "$dir" is old
fi