Предыдущая и следующая папка с использованием Bash

280
Miles

Это похоже на Как вывести список папок с помощью команд bash? , У меня есть структура папок в формате foo / YYYY / MM / DD / HHMM (с 10-минутными интервалами). Какой самый простой способ получить имя предыдущей и следующей папки?

Я думал о

sTimeNow=$(date "$/$/$ $:$ - "10 minutes") sTimeAfter=$(date "$ + "10 minutes") 

и с небольшим (пониманием ...) форматированием можно получить две директории.
Однако математика даты, вероятно, не лучший способ сделать это, и у меня пропущены даты (что является моей конечной целью исправить)

Также подумал о заполнении списка

MyList='ls -dr *" iFolder= get current folder index (how?) sFolderBefore=$Mylist[$-1] so much easier sFolderAfter=$Mylist[$+1] 

(все вышеперечисленное может иметь синтаксические ошибки, извинения новичка)

0

1 ответ на вопрос

0
xenoid

Я хотел бы попробовать что-то вроде:

find -type d | sort | grep -A 1 "$(basename "$PWD")\$" | tail -1 

Другими словами: подсвечивает все каталоги и находит тот, который идет после текущего в списке. С окончанием \$он перебирает ваши подкаталоги, без него он переходит в следующий каталог на том же уровне.

Для предыдущего каталога вы используете -B 1и head -1.

Редактировать: некоторые улучшения:

  1. Приведенный выше код имеет проблемы, если имена файлов содержат вещи, которые можно интерпретировать как синтаксис регулярных выражений (в частности, символы в скобках), поэтому лучше сделайте это grep -F(но вы больше не можете использовать \$)

  2. Чтобы избежать ложных срабатываний, если имя каталога не является начальной частью другого, используйте префикс /, чтобы сопоставление происходило с самого начала.

Итак, улучшенная форма это:

find -type d | sort | grep -A 1 -F "/$(basename "$PWD")" | tail -1 
Хорошо, я заменил / *` (так что это `mv '{} / *' .. / .. / .....`) и (2) добавить `-v` в `mv` или даже вместо` -exec mv` выполните `-exec echo mv`, чтобы увидеть, что будет выполнено. Miles 7 лет назад 0
Также это работает только на тот день. например, из foo / 2017/03/02/0000 говорится, что предыдущим является foo / 2017/03/02/0000. Работает отлично, если это тот же день. Miles 7 лет назад 0
Есть разница, если есть подкаталоги. Но так как вы используете `..`, у вас должен быть только один уровень. xenoid 7 лет назад 0
Это потому, что вы используете `..`, а не` / path / to / foo`. xenoid 7 лет назад 0

Похожие вопросы