パスから追加の「./」を削除するにはどうすればよいですか?

パスから追加の「./」を削除するにはどうすればよいですか?

次のスクリプトを検討してくださいcompare_times.sh(ありがとうございます。http://superuser.com/a/1780500):

#!/bin/bash
# Syntax: compare_times.sh directory_1 directory_2
# Semantics: for pairs of files with the same path at any depth in both directory_1 and directory_2, compare the file modification times and, if they differ, say which of the two files is older.
case "$2" in
    /*)
        # $2 is an absolute path
        cd $1
        find . -type f -exec bash -c "if [[ -f \"{}\" && -f \"$2/{}\" ]]; then if (cmp -s \"{}\" \"$2/{}\") then if [[ \"{}\" -ot \"$2/{}\" ]]; then echo \"$1/{} is older than $2/{}\"; else if [[ \"$2/{}\" -ot \"{}\" ]]; then echo \"$2/{} is older than $1/{}\"; fi; fi; fi; fi" \;;;
    *)
        # $2 is a relative path
        WORKING_DIR=$PWD
        cd $1
        find . -type f -exec bash -c "if [[ -f \"{}\" && -f \"$WORKING_DIR/$2/{}\" ]]; then if (cmp -s \"{}\" \"$WORKING_DIR/$2/{}\") then if [[ \"{}\" -ot \"$WORKING_DIR/$2/{}\" ]]; then echo \"$1/{} is older than $2/{}\"; else if [[ \"$WORKING_DIR/$2/{}\" -ot \"{}\" ]]; then echo \"$2/{} is older than $1/{}\"; fi; fi; fi; fi" \;
esac

計算時間とパス名の潜在的な抜け穴を除いて、スクリプトがうまく機能しているようです。ただし、出力は重複しています./

$ pwd
/tmp
$ ls --full-time ad bd | cut -d ' ' -f 6-
ad:

2023-05-14 15:38:02.707216583 +0200 f

bd:

2023-05-14 15:38:06.835165122 +0200 f
$ compare_times.sh ad bd
ad/./f is older than bd/./f
$ compare_times.sh /tmp/ad bd
/tmp/ad/./f is older than bd/./f
$ compare_times.sh ad /tmp/bd
ad/./f is older than /tmp/bd/./f
$ cd ad
$ compare_times.sh . ../bd  
././f is older than ../bd/./f
$ compare_times.sh . /tmp/bd
././f is older than /tmp/bd/./f
$ cd ../bd
$ compare_times.sh ../ad .
../ad/./f is older than ././f
$ compare_times.sh /tmp/ad .
/tmp/ad/./f is older than ././f

./出力を整理して読みやすくするにはどうすればよいですか?たとえば、上記で実行したコマンドの場合、予想される出力は次のようになります。

$ compare_times.sh ad bd
ad/f is older than bd/f
$ compare_times.sh /tmp/ad bd
/tmp/ad/f is older than bd/f
$ compare_times.sh ad /tmp/bd
ad/f is older than /tmp/bd/f
$ cd ad
$ compare_times.sh . ../bd      
f is older than ../bd/f
$ compare_times.sh . /tmp/bd
f is older than /tmp/bd/f
$ cd ../bd
$ compare_times.sh ../ad .
../ad/f is older than f
$ compare_times.sh /tmp/ad .
/tmp/ad/f is older than f

ベストアンサー1

本当に悪いコードです。

これを読みやすく理解するための最初のステップは、2つのスクリプトに分割することです。ただし、1つのスクリプトでも実行できます。

#! /bin/bash -

if [[ "$#" -eq 2 ]]; then

    [[ -d "$1" && -d "$2" ]] || exit 2

    scriptpath="$(realpath -- "$0")"
    d1_path="$(realpath -- "$1")"
    d2_path="$(realpath -- "$2")"
    PWD_ORI="$(realpath -- "$PWD")"
    cd -- "$d1_path" || exit 1
    find . -type f -exec "$scriptpath" "$d1_path" "$d2_path" {} "$PWD_ORI" \;

elif [[ "$#" -eq 4 ]]; then

    [[ -d "$1" && -d "$2" && -f "$3" ]] || exit 2

    d1_path="$1"
    d2_path="$2"
    file_relpath="$3"
    file_relpath="${file_relpath#./}"
    f1_path="${d1_path}/${file_relpath}"
    f2_path="${d2_path}/${file_relpath}"
    PWD_ORI="$4"

    if [[ -f "$f1_path" && -f "$f2_path" ]]; then
        if cmp -s -- "$f1_path" "$f2_path"; then
            if   [[ "$f1_path" -ot "$f2_path" ]]; then
                printf '%s\n' "'${f1_path#"$PWD_ORI"}' is older than '${f2_path#"$PWD_ORI"}'"
            elif [[ "$f2_path" -ot "$f1_path" ]]; then
                printf '%s\n' "'${f2_path#"$PWD_ORI"}' is older than '${f1_path#"$PWD_ORI"}'"
            fi
        fi
    fi
fi

おすすめ記事