X-Git-Url: https://iankelling.org/git/?p=lnf;a=blobdiff_plain;f=lnf;h=1ab1cdf95689cdb5b754d6cc7e25559ca106baf1;hp=2518c1c4ac60cf35147ba72bdc886c252759bbe2;hb=b6ffa65f29eacbe5d010548b2bfa2c071e87fb11;hpb=df814ed22cf0dfb2f93cc4c228099d36c40b6fae diff --git a/lnf b/lnf index 2518c1c..1ab1cdf 100755 --- a/lnf +++ b/lnf @@ -15,7 +15,10 @@ Create directory if needed. Slightly more restrictive arguments than ln. In the 1st form, create a link to TARGET with the name LINK_NAME. In the 2nd form, create a link to TARGET in the current directory. In the 3rd form, create -links to each TARGET in DIRECTORY." +links to each TARGET in DIRECTORY. + +Do export LNF_VERBOSE=true for verbose output +" if [[ $1 == --help || $1 == -h || $# -eq 0 ]]; then echo "$help" @@ -32,6 +35,7 @@ links to each TARGET in DIRECTORY." fi fi + local reset_extglob=false ! shopt extglob >/dev/null && reset_extglob=true shopt -s extglob @@ -42,18 +46,20 @@ links to each TARGET in DIRECTORY." to_remove=() if [[ $nodir ]]; then - dir="$(dirname "$2")" - if [[ -e $2 || -L $2 ]]; then - to_remove+=("$2") - elif [[ ! -d $dir ]]; then + dest_file="$2" + dest_dir="$(dirname "$dest_file")" + if [[ -e $dest_file || -L $dest_file ]]; then + to_remove+=("$dest_file") + elif [[ ! -d $dest_dir ]]; then mkdir=true - if [[ -e $dir || -L $dir ]]; then + if [[ -e $dest_dir || -L $dest_dir ]]; then to_remove+=("$dir") fi fi elif (( $# >= 2 )); then - if [[ -d ${!#} ]]; then - prefix="${!#}/" # last arg + dest_dir="${!#}" + if [[ -d $dest_dir ]]; then + prefix="$dest_dir/" # last arg for x in "${@:1:$(( $# - 1 ))}"; do # all but last arg # Remove 1 or more trailing slashes, using. x="${x%%+(/)}" @@ -62,16 +68,16 @@ links to each TARGET in DIRECTORY." [[ -e "$x" || -L "$x" ]] && to_remove+=("$x") done else - if ! mkdir -p "${!#}"; then - echo "lnf error: failed to make directory ${!#}" - return 1 - fi + mkdir=true fi elif [[ $# -eq 1 ]]; then [[ -e "${1##*/}" || -L "${1##*/}" ]] && to_remove+=("${1##*/}") fi if (( ${#to_remove[@]} >= 1 )); then if type -P trash-put >/dev/null; then + if [[ $LNF_VERBOSE == true ]]; then + echo "lnf: trash-put -- ${to_remove[*]}" + fi trash-put -- "${to_remove[@]}" || ret=$? # trash-put will fail to trash a link that goes across filesystems (72), # and for empty files (74) @@ -86,6 +92,9 @@ links to each TARGET in DIRECTORY." return $x fi else + if [[ $LNF_VERBOSE == true ]]; then + echo "lnf: rm -rf -- ${to_remove[*]}" + fi rm -rf -- "${to_remove[@]}" fi fi @@ -93,8 +102,8 @@ links to each TARGET in DIRECTORY." $reset_extglob && shopt -u extglob if $mkdir; then - if ! mkdir -p "$(dirname "$2")"; then - echo "lnf error: failed to make directory $(dirname "$2")" + if ! mkdir -p "$dest_dir"; then + echo "lnf error: failed to make directory $dest_dir" return 1 fi fi