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.
В зависимости от того, что именно вы хотите сделать, и структуры ваших файлов, могут быть доступны и другие возможности, такие как :
ls -1tq /dir/*/readme.txt | head -n 1
Возвращает полное имя последнего readme.txt, найденного в любом подкаталоге (не рекурсивном) /dir/
Использование * в качестве части пути (а не только в качестве части имени файла), часто являющегося малоизвестным, я подумал, что стоит упомянуть об этом.
file=$( ls -1tq /dir/*/readme.txt | head -n 1 )
cd $( dirname "$file" )
Для большей переносимости вы можете использовать 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, мы сравниваем каждый элемент массива по второму элементу, который является модифицированным временем. @{...}
снимаем ссылку с массива, сдвиг
получаем первый элемент, который является именем каталога. Краткий ответ: загляните в man find
и опции «время». Это определит местонахождение файла (ов), а затем с помощью параметра -printf
отобразит путь к файлу (-ам), который затем можно будет использовать для cd
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"
затем проверяет непустой результат и перемещается в каталог, если он не пустой.
Для этого не нужны сложные конвейеры. Более того, вам не нужно найти
что-либо - вы уже знаете, где находится каждый файл, вы просто не знаете, какой из них самый новый. С этим легко справиться.
Для демонстрации вот мой небольшой тест:
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