Sida 1 av 1

Öppna en länks måls föräldra mapp (Nautilus-script)

Postat: 19 apr 2010, 20:36
av tergo
Det blir ett Nautilus-script då och då, men bara jag använder dom.
Detta är ett av dom jag använder mest.
Finns det verkligen inget stöd för detta i linux ett system som kryllar av länkar.
Finns det inget bättre sätt?
Kanske förslag på bättre eller annan kodning?

Kod: Markera allt

#!/bin/bash
 # Nautilus-script
 # Path and filename "./.gnome2/nautilus-scripts/LinkOpenTargetsParentDir.sh"
 # Öppnar en länks måls föräldra mapp
 # Opens link targets parent directory
 FILE_B_OUTPUT=`file -b "$1" |cut -d "/" -f2- |sed 's/\(.*\)./\1/'`
 # ex: file -b "/media/Ubuntu/Link_folder/Link_to_targetfile"
 # = symbolic link to `/media/Ubuntu/target_folder/targetfile'
 # ex: file -b "/media/Ubuntu/Link_folder/Link_to_targetfile" |cut -d"/" -f2- |sed 's/\(.*\)./\1/'
 # = media/Ubuntu/target_folder/targetfile
 # Observe that "Cut" takes away first "/"
 TARGET_DIRECTORY="${FILE_B_OUTPUT%/*}"
 # ex :TARGET_DIRECTORY="media/Ubuntu/target_folder"
 setsid nautilus /"$TARGET_DIRECTORY"
 # add missing "/"
 exit

Re: Öppna en länks måls föräldra mapp (Nautilus-script)

Postat: 19 apr 2010, 20:48
av dmz
Jag har aldrig använt nautilus, men för att gå till föräldramappen kan du gör så här;

Kod: Markera allt

cd $(pwd|perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/')
Edit: Nu blev det fel. Det kommer att landa två nivåer upp från /, t.ex /mnt/Foo/. För att gå upp en nivå i taget;

Kod: Markera allt

cd $(pwd|perl -pe 's/^((?:\/[^\/]+)*\/).*/$1/')
Du kan ju också använda ../

Re: Öppna en länks måls föräldra mapp (Nautilus-script)

Postat: 20 apr 2010, 01:52
av Konservburk
tergo skrev:Finns det verkligen inget stöd för detta i linux ett system som kryllar av länkar.
Finns det inget bättre sätt?
Kanske förslag på bättre eller annan kodning?
Du tar alltså utdatan från file -b och klipper bort allt fram till och med det första / och klipper sedan bort det sista tecknet från det som är kvar. Därefter klipper du bort allting från och med det sista / och lägger slutligen till ett / i början och startar det hela med nautilus. Jag förstår att du inte är helt nöjd med tillvägagånssättet.

Har du ens tänkt på att symlänkar inte behöver innehålla något / öht? I ett sådant fall klipper din kod bara bort sista tecknet och resultatet blir att du försöker köra något i stil med:

Kod: Markera allt

setsid nautilus /"symbolic link to `det symlänken pekar på"
...vilket du förmodlingen inte alls vill. För att inte tala om vad som händer om du råkar köra skriptet med något annant än en symlänk.

Men för att vara lite konstruktiv så är kommandot readlink till för att ta reda på vart symlänkar pekar, och kommandot dirname är till för att ta reda på föräldrakatalogen. Där har du i princip allt du behöver. Så här skulle det kunna se ut:

Kod: Markera allt

#!/bin/sh
for i
do readlink -f "$i" | xargs -r dirname | xargs -r setsid nautilus
done
Det kan ju såklart mellanlagra i variabler istället om du tycker det är bättre än en pipeline. Om du inte fattat det redan så är for-snurran bara till för att man ska kunna köra skriptet med flera länkar på en gång.

Re: Öppna en länks måls föräldra mapp (Nautilus-script)

Postat: 20 apr 2010, 17:16
av Substrata
Är inte vass på shellscripting men här är min lösning:

Kod: Markera allt

# follow symlink of argument and give directory name:
sldname() {
    if $(test -h $1)
    then
        a=$(readlink $1)
        echo $(dirname $a)
    fi
}
Vet dock inte hur man i sh hanterar funktioner som bara ibland ger ett resulterande värde. $(test -h $1) kan annars flyttas ut, så att funktionen enbart anropas när det finns en giltig symbolisk länk som argument.

Re: Öppna en länks måls föräldra mapp (Nautilus-script)

Postat: 20 apr 2010, 17:28
av Substrata
dmz skrev:Jag har aldrig använt nautilus, men för att gå till föräldramappen kan du gör så här;

Kod: Markera allt

cd $(pwd|perl -pe 's/^((?:\/[^\/]+){2}\/).*/$1/')
Edit: Nu blev det fel. Det kommer att landa två nivåer upp från /, t.ex /mnt/Foo/. För att gå upp en nivå i taget;

Kod: Markera allt

cd $(pwd|perl -pe 's/^((?:\/[^\/]+)*\/).*/$1/')
Du kan ju också använda ../
Enklare regexp: s/([^\/]+$)// :)

Re: Öppna en länks måls föräldra mapp (Nautilus-script)

Postat: 20 apr 2010, 18:07
av tergo
Tack "Konservburk" för dit svar
Eftersom jag skrev att jag använder scriptet utgår själv ifrån att det fungerar???
"readlink" den hade jag glömt, tyvärr inte Posix,
Skrev ett nytt script som ser trevligare ut och fungerar (när jag testade).
Jag blev nöjd.

Glömde skriva att inte använder "xargs" om inget tvingar mig.
--
Ändring: "${READLINK_OUTPUT%/*} till: "/${READLINK_OUTPUT%/*}"
Smart, tog ett tag innan jag fattade. Tackar konservburken igen.
--

Kod: Markera allt

#!/bin/bash
# Nautilus-script
 [ -h "$1" ]\
 &&READLINK_OUTPUT=`readlink -f "$1"`\
 &&TARGET_DIRECTORY="/${READLINK_OUTPUT%/*}"\
 &&setsid nautilus "$TARGET_DIRECTORY"
 exit

Re: Öppna en länks måls föräldra mapp (Nautilus-script)

Postat: 20 apr 2010, 18:24
av Konservburk
@tergo
Se upp lite med "${READLINK_OUTPUT%/*}", den klipper bort det första / om du har en länk som pekar på något i roten. Du kan unvika det med "/${READLINK_OUTPUT%/*}" om du nu inte vill använda dirname.