Скрипт Bash для перехода в новейший каталог в каталоге - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь добавить функцию в скрипт bash сбора данных, который я пишу. Намерением было бы указать конкретный каталог, а затем перейти в каталог NEWEST в родительских каталогах.

псевдокод:

cd top_dir
    for each dir in top_dir:
      age = dir.age
      if age < least_age:
        least_age = age
        newest_dir = dir

    cd newest_dir

Я пытался использовать cd "$( find "$1"/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)" из этого поста , но вместо этого он переместил меня в самый новый каталог на моем компьютере.

Предполагается, что структура каталогов будет выглядеть следующим образом:

parent_dir:
  child_1 | Last Edited 1 Hr Ago
  child_2 | Last Edited 1 Yr Ago
  child_3 | Last Edited 2 Yr Ago
  child_4 | Last Edited 1 Min Ago
  child_5 | Last Edited 1 Week Ago

Команда cd изменит меня на child_4

Ответы [ 2 ]

5 голосов
/ 07 марта 2019

Код, который вы пытаетесь использовать, предназначен для тела функции;вызов функции устанавливает $1 правильно.Само по себе $1, вероятно, не установлено, и поэтому find операторы на ""/ (так же, как /), а не top_dir.

new_cd () {
  cd "$( find "$1"/* -prune -type d 2>/dev/null | xargs stat -c "%Y %n" 2>/dev/null | sort -nr | head -n 1 | cut -d " " -f 2-)"
}

new_cd top_dir

Это можно немного упростить,Нет необходимости использовать find или xargs;простой цикл будет делать.А так как у вас есть функция, теперь нет необходимости втискивать все в одну строку.

new_cd () {
  new_d=$(for d in "$1"/*/; do
      stat -c "%Y %n" "$d" 2> /dev/null
  done | sort -nr |
         head -n |
         cut -d " " -f 2-)
  cd "$new_d"
}

У этого есть один незначительный недостаток: подстановка команды сожрет любые завершающие символы новой строки в выводе cut, поэтомуубедитесь, что ни одно из имен каталогов не заканчивается символом новой строки.(Эта чрезвычайно незначительная ошибка может быть исправлена, но, вероятно, не стоит этого делать; просто помните об этом.)

У нее также есть больший недостаток: так как не -следующие символы новой строки не съедено, вы не можете предполагать, что вывод цикла состоит из ровно одного файла в строке;один файл может занимать несколько строк.Самое простое решение - избегать имен каталогов с символами новой строки.Более надежное исправление отменяет конвейер.

new_cd () {
  local newest_time newest_d
  for d in "$1"/*/; do
    t=$(stat -c "%Y" "$d")
    if (( t > newest_time )); then
      newest_time=$t
      newest_d=$d
    fi
  done
  cd "$newest_d"
}
2 голосов
/ 07 марта 2019

Самый последний подкаталог можно найти с помощью ls -ldt */ | head -1: опция t сортирует файлы по дате и * / соответствует только подкаталогам, но не файлам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...