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

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
tergo
Inlägg: 90
Blev medlem: 15 okt 2007, 23:35
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

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

Inlägg 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
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

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

Inlägg 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 ../
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

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

Inlägg 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.
Användarvisningsbild
Substrata
Inlägg: 71
Blev medlem: 13 apr 2010, 11:01
OS: Arch Linux
Utgåva: Vet inte/ingen utgåva passar

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

Inlägg 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.
Användarvisningsbild
Substrata
Inlägg: 71
Blev medlem: 13 apr 2010, 11:01
OS: Arch Linux
Utgåva: Vet inte/ingen utgåva passar

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

Inlägg 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/([^\/]+$)// :)
tergo
Inlägg: 90
Blev medlem: 15 okt 2007, 23:35
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS

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

Inlägg 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
Senast redigerad av 1 tergo, redigerad totalt 20 gånger.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

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

Inlägg 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.
Skriv svar

Återgå till "Terminalforum"