"locate"는 절대 경로 대신 상대 경로를 반환합니다.

"locate"는 절대 경로 대신 상대 경로를 반환합니다.

누군가가 여기에 게시하는 것이 더 적절할 것이라고 제안했습니다(이전 게시물은 삭제하겠습니다).

내 MacBook의 루트에는 다음 항목이 있습니다 crontab.

0 */4 * * * cd /private/var/root && ./locate.updatedb

locate다음 지역에 별칭이 있습니다 ~/.zshrc.

alias locate='locate -d /var/db/locate.database'   

" "를 수행하면 locate Table_Synthesis_GREY_찾은 모든 파일의 전체 경로에서 파일 시스템의 루트 경로를 나타내는 첫 번째 슬래시가 누락됩니다. 다음은 샘플 출력입니다.

Users/henry/Projects/JUNK_AND_OLD/Travail_9_Paper_Combinaison_et_Methode_des_biais_communs_pour_ma_These_SAUVEGARDES/TABLES_FLAT_AND_NON_FLAT_to_include_into_my_Phd_paper_LAST/Table_Synthesis_Main_05_AOUT_2020/temp/Table_Synthesis_GREY_IMPORTANT_SAVE_5_AOUT_2020.run.xml
Users/henry/Projects/JUNK_AND_OLD/Travail_9_Paper_Combinaison_et_Methode_des_biais_communs_pour_ma_These_SAUVEGARDES/TABLES_FLAT_AND_NON_FLAT_to_include_into_my_Phd_paper_LAST/Table_Synthesis_Main_05_AOUT_2020/temp/Table_Synthesis_GREY_IMPORTANT_SAVE_5_AOUT_2020.tex
Users/henry/Projects/JUNK_AND_OLD/Travail_9_Paper_Combinaison_et_Methode_des_biais_communs_pour_ma_These_SAUVEGARDES/TABLES_FLAT_AND_NON_FLAT_to_include_into_my_Phd_paper_LAST/Table_Synthesis_Main_05_AOUT_2020/temp/Table_Synthesis_GREY_IMPORTANT_SAVE_5_AOUT_2020.zip
Users/henry/Projects/JUNK_AND_OLD/Travail_9_Paper_Combinaison_et_Methode_des_biais_communs_pour_ma_These_SAUVEGARDES/TABLES_FLAT_AND_NON_FLAT_to_include_into_my_Phd_paper_LAST/Table_Synthesis_Main_05_AOUT_2020/temp/Table_Synthesis_GREY_IMPORTANT_SAVE_5_AOUT_2020_ORIGINAL_INTO_zip_here.pdf
Users/henry/Projects/JUNK_AND_OLD/Travail_9_Paper_Combinaison_et_Methode_des_biais_communs_pour_ma_These_SAUVEGARDES/TABLES_FLAT_AND_NON_FLAT_to_include_into_my_Phd_paper_LAST/Table_Synthesis_Main_AFTER_05_AOUT_2020/FLAT_Synthesis/Table_Synthesis_GREY_FLAT.docx

경로를 절대 경로(예: 에서 시작)로 출력하려면 어떻게 해야 합니까 /Users? 원하는 출력은

/Users/henry/Projects/JUNK_AND_OLD/Travail_9_Paper_Combinaison_et_Methode_des_biais_communs_pour_ma_These_SAUVEGARDES/TABLES_FLAT_AND_NON_FLAT_to_include_into_my_Phd_paper_LAST/Table_Synthesis_Main_AFTER_05_AOUT_2020/FLAT_Synthesis/Table_Synthesis_GREY_FLAT.docx

상대적인

Users/henry/Projects/JUNK_AND_OLD/Travail_9_Paper_Combinaison_et_Methode_des_biais_communs_pour_ma_These_SAUVEGARDES/TABLES_FLAT_AND_NON_FLAT_to_include_into_my_Phd_paper_LAST/Table_Synthesis_Main_AFTER_05_AOUT_2020/FLAT_Synthesis/Table_Synthesis_GREY_FLAT.docx

업데이트 1:/usr/libexec/locate.updatedb기본 루트 디렉토리에 복사했습니다 . 즉, 를 사용 하거나 사용 하더라도 파일 /var/root/을 수정할 수 없기 때문에 이 작업을 수행했습니다 ./usr/libexec/locate.updatedbbeing rootsudo

따라서 다른 파일에서 다음 /var/root/locate.updatedb을 수정할 수 있습니다.

if [ "$(id -u)" = "99" ]; then

처음에는 대신:

if [ "$(id -u)" = "0" ]; then

이 기술에 대해 어떻게 생각하시나요? 주로 결과가 나에게 올 때 이유 /Users/henry/.

0 */4 * * * cd /private/var/root ; /bin/sh locate.updatedb

그러나 문제는 남아 있습니다.

그런데 결과가 /Applications 또는 다른 홈 디렉터리에 있는 경우하지만 체계적으로는 아니죠, 첫 번째 슬래시가 정상적으로 표시됩니다.

스크립트의 내용은 그리 크지 않습니다. 여기에는 다음과 같습니다.

# $FreeBSD: src/usr.bin/locate/locate/updatedb.sh,v 1.20 2005/11/12 12:45:08 grog Exp $

if [ "$(id -u)" = "99" ]; then
    rc=0
    export FCODES=`sudo -u nobody mktemp -t updatedb`
    chown nobody $FCODES
    tmpdb=`su -fm nobody -c "$0"` || rc=1
    if [ $rc = 0 ]; then
        install -m 0444 -o nobody -g wheel $FCODES /var/db/locate.database
    fi
    rm $FCODES
    exit $rc
fi
: ${LOCATE_CONFIG="/etc/locate.rc"}
if [ -f "$LOCATE_CONFIG" -a -r "$LOCATE_CONFIG" ]; then
       . $LOCATE_CONFIG
fi

# The directory containing locate subprograms
: ${LIBEXECDIR:=/usr/libexec}; export LIBEXECDIR
: ${TMPDIR:=/tmp}; export TMPDIR
if ! TMPDIR=`mktemp -d $TMPDIR/locateXXXXXXXXXX`; then
    exit 1
fi

PATH=$LIBEXECDIR:/bin:/usr/bin:$PATH; export PATH

# 6497475
set -o noglob

: ${mklocatedb:=locate.mklocatedb}      # make locate database program
: ${FCODES:=/var/db/locate.database}    # the database
: ${SEARCHPATHS:="/"}                   # directories to be put in the database
: ${PRUNEPATHS:="/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb"} # unwanted directories
: ${FILESYSTEMS:="hfs ufs apfs"}        # allowed filesystems
: ${find:=find}

case X"$SEARCHPATHS" in 
    X) echo "$0: empty variable SEARCHPATHS"; exit 1;; esac
case X"$FILESYSTEMS" in 
    X) echo "$0: empty variable FILESYSTEMS"; exit 1;; esac

# Make a list a paths to exclude in the locate run
excludes="! (" or=""
for fstype in $FILESYSTEMS
do
    excludes="$excludes $or -fstype $fstype"
    or="-or"
done
excludes="$excludes ) -prune"

case X"$PRUNEPATHS" in
    X) ;;
    *) for path in $PRUNEPATHS
    do
        excludes="$excludes -or -path $path -prune"
    done;;
esac

# Ignore the target of firmlinks
while read firmlink; do
    excludes="$excludes -or -path $firmlink -prune"
done <<< "$(awk -F'\t' '{print "/System/Volumes/Data/" $2}' /usr/share/firmlinks)"

tmp=$TMPDIR/_updatedb$$
trap 'rm -f $tmp; rmdir $TMPDIR; exit' 0 1 2 3 5 10 15

# search locally
# echo $find $SEARCHPATHS $excludes -or -print && exit
if $find -s $SEARCHPATHS $excludes -or -print 2>/dev/null |
        $mklocatedb -presort > $tmp
then
    case X"`$find $tmp -size -257c -print`" in
        X) cat $tmp > $FCODES;;
        *) echo "updatedb: locate database $tmp is empty"
           exit 1
    esac
fi

누구든지 단서가 있습니까?

업데이트 2:다음 출력 sudo ls -Alh /private/var/root:

total 128K
-r--------  1 root wheel    7 Dec  8 23:29 .CFUserTextEncoding
drwx------  3 root wheel   96 Dec  8 23:29 .Trash
-rw-------  1 root wheel 5.6K Oct 21 20:49 .bash_history
drwx------  3 root wheel   96 Dec  8 23:44 .bash_sessions
drwx------  3 root wheel   96 Oct 16 14:02 .config
-rw-------  1 root wheel 2.5K Dec  9 02:55 .dircolors
-r--r--r--  1 root wheel   10 Apr 17  2020 .forward
drwxr-xr-x  4 root wheel  128 Apr 10  2020 .grc
drwxr-xr-x  3 root wheel   96 Oct  6 00:15 .gsutil
drwxr-xr-x  2 root wheel   64 Jan  1 00:40 .nedit
drwxr-xr-x  4 root wheel  128 Oct  5 22:38 .parallel
drwx------  3 root wheel   96 Sep 17 02:49 .ssh
-rw-------  1 root wheel  14K Jan 17 14:21 .viminfo
-rw-r--r--  1 root wheel 2.9K Dec  9 02:57 .vimrc
-rw-r--r--  1 root wheel  47K Dec  9 02:56 .zcompdump
-rw-------  1 root wheel  15K Jan 19 22:55 .zsh_history
-rw-r--r--  1 root wheel  17K Dec 22 17:52 .zshrc
drwx------  2 root wheel   64 Dec  8 23:29 Downloads
drwxr-xr-x 44 root wheel 1.4K Dec 13 15:05 Library
-rwxr-xr-x  1 root wheel 3.6K Jan 11 01:52 locate.updatedb

또한 데이터베이스를 다음과 같이 구성했습니다.

$ ls -l /var/db/locate.database
-rw-r--r-- 1 root 330M Jan 24 17:01 /var/db/locate.database

업데이트 3:""로 복원하면 if [ "$(id -u)" = "0" ]; then루트에서 부팅할 수 있습니다.

mktemp: too few X's in template ‘updatedb’
chown: missing operand after ‘nobody’
Try 'chown --help' for more information.
zsh:1: permission denied: ./locate.updatedb
rm: missing operand
Try 'rm --help' for more information.

업데이트 4:이것이 마지막 문제입니다:

만약 내가한다면:

if [ "$(id -u)" = "0" ]; then
    rc=0
    #export FCODES=`sudo -u nobody mktemp -t updatedb`
    export FCODES=`sudo -u nobody mktemp -t updatedbXXXXXXXXXX`
    chown nobody $FCODES
    tmpdb=`su -fm nobody -c "$0"` || rc=1
    if [ $rc = 0 ]; then
        install -m 0444 -o nobody -g wheel $FCODES /var/db/locate.database
    fi
    rm $FCODES
    exit $rc
fi

Locate.updatedb 스크립트를 시작하면 다음과 같은 결과가 나타납니다.

# ./locate.updatedb
zsh:1: permission denied: ./locate.updatedb

어떤 아이디어가 있나요?

답변1

사용자 정의 스크립트를 사용하고 이를 locate명령에 별칭으로 지정하겠습니다. 제안:

#!/bin/bash
 
path=$(locate $1)
full_path=$(dirname $path)
echo $full_path

관련 정보