Изменитесь на последний измененный подкаталог текущего каталога

DNS работает в обоих направлениях.

главным образом это используется для отображения человеческого memorizable имени (например. mail.domain.com) к IP-адресам (например. 1.2.3.4). это сделано через так называемый A записи, например:

mail.domain.com. IN A  1.2.3.4

изменить IP-адрес, который разрешен vrom mail.domain.com, необходимо управлять доменом domain.com. только затем можно изменить ту запись.

но это также работает наоборот, для отображения IP-адресов на доменные имена. IP-адреса (как доменные имена) иерархические по своей природе, но (в отличие от доменных имен) высший уровень находится на левой стороне. отображение работ через PTR записи, с помощью "псевдодомена" in-addr.arpa запись "обратного поиска" для вышеупомянутого примера похожа на следующее (отметьте обратное упорядочивание IP-адреса),

4.3.2.1.in-addr.arpa IN PTR mail.domain.com.

изменить имя, которое разрешено от IP-адреса 1.2.3.4, необходимо управлять "доменом" 4.3.2.1.in-addr.arpa. только затем можно изменить ту запись.

таким образом, для изменения обратного поиска, необходимо узнать, кто отвечает за диапазон IP, и запросите, чтобы они зафиксировали запись PTR.

2
04.10.2016, 13:21
4 ответа

В зависимости от того, что именно вы хотите сделать, и структуры ваших файлов, могут быть доступны и другие возможности, такие как :

ls -1tq /dir/*/readme.txt | head -n 1

Возвращает полное имя последнего readme.txt, найденного в любом подкаталоге (не рекурсивном) /dir/

Использование * в качестве части пути (а не только в качестве части имени файла), часто являющегося малоизвестным, я подумал, что стоит упомянуть об этом.

file=$( ls -1tq /dir/*/readme.txt | head -n 1 )
cd $( dirname "$file" )
2
27.01.2020, 21:53

Для большей переносимости вы можете использовать perl:

$ perl -MList::Util=reduce -le '
    BEGIN { $dir = "." }
    opendir DIR,$dir;
    print shift @{(reduce {$a->[1] > $b->[1] ? $a : $b}
                   map {[$_,(stat($_))[9]]}
                   grep { -d and !/^..?$/ }
                   readdir DIR)}
'
.Skype

Измените $dir на любой каталог, который хотите найти.

Как это работает

  • readdir возвращает список всех файлов и директорий в dir handle, открытых с помощью opendir
  • grep { -d и !/^...?$/ }: мы получаем все директории, пропускаем . и ... .
  • map {[$_,(stat($_))[9]]}: создаем массив, его элемент - ссылка на массив с двумя элементами:
    • Первый - это имя каталога
    • Второй - это изменение времени
  • уменьшения {$a->[1] > $b->[1] ? $a : $b: как и в функции max, мы сравниваем каждый элемент массива по второму элементу, который является модифицированным временем.
  • @{...} снимаем ссылку с массива, сдвиг получаем первый элемент, который является именем каталога.
1
27.01.2020, 21:53

Краткий ответ: загляните в man find и опции «время». Это определит местонахождение файла (ов), а затем с помощью параметра -printf отобразит путь к файлу (-ам), который затем можно будет использовать для cd


One way для использования find и извлечения DIR файла, к которому осуществлялся последний доступ (в течение последних 24 часов) в текущем каталоге и его подкаталогах
lastAccDir="$(find 2>/dev/null . -type f -atime 1 -printf "%a~%h\n" | sort -r | head -n 1 | cut -d~ -f2)"

или то же самое с продолжением строки (более читабельно)

lastAccDir="$(
find 2>/dev/null . -type f \ -atime 1 -printf "%a~%h\n" \
 | sort -r \
 | head -n 1 \
 | cut -d~ -f2
)"

Обратите внимание, что это МОЖЕТ привести к пустому результату из-за теста -atime 1 (последние 24 часа)

! -z "$ lastAccDir" && cd "$ lastAccDir"
затем проверяет непустой результат и перемещается в каталог, если он не пустой.

0
27.01.2020, 21:53

Для этого не нужны сложные конвейеры. Более того, вам не нужно найти что-либо - вы уже знаете, где находится каждый файл, вы просто не знаете, какой из них самый новый. С этим легко справиться.

Для демонстрации вот мой небольшой тест:

mkdir ./dir1 ./dir2 ./dir3

for d in 1 2 3
do  touch ./dir$d/samefile
    sleep 1
done

Это создает набор тестов. Теперь, что новее?

set -- ./dir[123]/samefile
while [ -e "$2" ]
do  [ "$1" -nt "$2" ] && 
    set -- "$@" "$1"
shift; done
printf %s\\n "$@"

Это мне скажет.

ВЫВОД

./dir3/samefile

И я могу менять порядок операции touch сколько захочу - это даст мне правильную информацию. Все, что вам нужно, это этот крошечный цикл оболочки в функции, подобной этой:

newd() { ${2:+:} return 1
    while [ -e "$2" ] && [ -e "$1" ]
    do  [ "$1" -nt "$2" ] && 
        set -- "$@" "$1"
    shift; done
    ${2+false} cd "${1%/*}"
}

Обратите внимание, что это немного отличается от демонстрации, поэтому она надежно завершится ошибкой, если будет меньше двух аргументов или если какой-либо аргумент не является фактическим путем.

Теперь вы можете называть это так:

newd ./path/to/file1 ./path/to/file2

... и так далее - с любым количеством аргументов.

Или в моем тестовом примере:

newd ./dir[123]/samefile ; pwd

ВЫХОД

/home/mikeserv/test/dir3
4
27.01.2020, 21:53

Теги

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