Несколько вариантов:
awk '
function basename(file) {
sub(".*/", "", file)
return file
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Или:
awk '
function basename(file, a, n) {
n = split(file, a, "/")
return a[n]
}
{print FILENAME, basename(FILENAME)}' /path/to/file
Обратите внимание, что эти реализации basename
должны работать для общие случаи, но не в угловых случаях, таких как basename / path / to / x ///
, где они возвращают пустую строку вместо x
или /
, где они вернуть пустую строку вместо /
, хотя для обычных файлов этого не должно происходить.
Первый не будет работать должным образом, если пути к файлам (до последнего /
) содержат последовательности байтов, которые не образуют допустимые символы в текущей локали (обычно такое происходит в Локали UTF-8 с именами файлов, закодированными в некотором 8-битном однобайтовом наборе символов). Вы можете обойти это, установив языковой стандарт на C, где каждая последовательность байтов формирует допустимые символы.
Решение найдено, я отредактировал /etc/exports следующим образом
/export 10.2.0.0/24(ro,no_subtree_check,fsid=0,sec=krb5p:sys)
/export/private 10.2.0.0/24(ro,no_subtree_check,async,root_squash,nohide,sec=krb5p)
/export/public 10.2.0.0/24(ro,no_subtree_check,async,root_squash,nohide,sec=sys)
Теперь работает отлично.
mount -vvv -t nfs4 -o sec=krb5p centos1.myrealm.fake:/private /mnt
mount.nfs4: timeout set for Sun Mar 3 09:59:06 2019
mount.nfs4: trying text-based options 'sec=krb5p,vers=4.1,addr=10.2.0.77,clientaddr=10.2.0.77'
umount /mnt
mount -vvv -t nfs4 -o sec=sys centos1.myrealm.fake:/public /mnt
mount.nfs4: timeout set for Sun Mar 3 09:59:19 2019
mount.nfs4: trying text-based options 'sec=sys,vers=4.1,addr=10.2.0.77,clientaddr=10.2.0.77'