Vill du vara del av diskussionerna i forumet, ställa frågor eller hjälpa andra? Registrera dig här!
Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Aug 2001

Automatisk filorganisation

Jag har följande problem jag vill lösa. Om en specifik filtyp laddas ner vill jag att den automatiskt flyttas till ett annat ställe. I det här fallet till en katalog på nätverket som delas med Samba.

I Windows har jag löst det genom ett Chrome-tilägg, RegExp, som sparar ner filtypen till en symlink som leder till min smb-share. Linux tillåter dock inte dylika symlinkar.

Frågan är då, finns det någon "app" för det?

Trädvy Permalänk
Medlem
Registrerad
Okt 2013

@DasIch:

Lite av en hack lösning men:
Om du sitter på en linux installation så bör du ju bara kunna göra ett skript som läser av din nedladdnings-mapp och sedan flyttar alla filer till sina respektive destinationer. Detta skript går ju att låta köras automatiskt genom att sätta det som ett cron-job som körs varje minut, kvart, timme, etc.

Trädvy Permalänk
Rekordmedlem
Plats
Salstad
Registrerad
Feb 2009

Det borde inte vara så svårt att göra ett bash-script som fixar det och automatisk köra skriptet via cron.

Ryzen 5 2400G, Asus ROG STRIX B350-F Gaming, 500GB Samsung 970EVO NVMe M.2 och en väldig massa masslagring. Seasonic Focus+ Gold 650W, Antec P 180 med Schyte o Sharkoon fläktar via en t-balancer, Tittar på en Acer ET430Kbmiippx 43" 4K
Främre ljudkanalerna återges via Behringer DCX2496, högtalare Truth B3031A, Truth B2092A Har också Oscilloskop, mätmikrofon och en Colorimeter.

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Aug 2001

Jag är ingen fena på bash-skript men det finns en del exempel att ta hjälp av om jag googlar, så det ska väl kunna funka. Men, jag vet inte om det är en bra ide att köra som cron-job. Den skulle ju få köra med väldigt täta intervaller och oftast helt i onödan. Mycket bättre med nån sorts trigger kopplad till mappen, men hur gör man det?

Trädvy Permalänk
Rekordmedlem
Plats
Salstad
Registrerad
Feb 2009
Skrivet av DasIch:

Jag är ingen fena på bash-skript men det finns en del exempel att ta hjälp av om jag googlar, så det ska väl kunna funka. Men, jag vet inte om det är en bra ide att köra som cron-job. Den skulle ju få köra med väldigt täta intervaller och oftast helt i onödan. Mycket bättre med nån sorts trigger kopplad till mappen, men hur gör man det?

Jag vet inte vad som tar minst resurser men skriptet blir ju så litet att det lär gå att köra det varje sekund om du vill utan att systembelastningen lär bli särskilt påverkad om det går "i tomme" och antagligen blir lasten snarlik om du gör nån loop i ett script som kollar om det finns nått i mappen.
Jag är inte heller nån bashexpert men det känns inte som om det är nått som behöver optimeras för att det stjäl systemresurser.

Ryzen 5 2400G, Asus ROG STRIX B350-F Gaming, 500GB Samsung 970EVO NVMe M.2 och en väldig massa masslagring. Seasonic Focus+ Gold 650W, Antec P 180 med Schyte o Sharkoon fläktar via en t-balancer, Tittar på en Acer ET430Kbmiippx 43" 4K
Främre ljudkanalerna återges via Behringer DCX2496, högtalare Truth B3031A, Truth B2092A Har också Oscilloskop, mätmikrofon och en Colorimeter.

Trädvy Permalänk
Medlem
Registrerad
Aug 2002
Skrivet av DasIch:

Jag är ingen fena på bash-skript men det finns en del exempel att ta hjälp av om jag googlar, så det ska väl kunna funka. Men, jag vet inte om det är en bra ide att köra som cron-job. Den skulle ju få köra med väldigt täta intervaller och oftast helt i onödan. Mycket bättre med nån sorts trigger kopplad till mappen, men hur gör man det?

Kolla på ”inotifywait”

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Om du kan få RegExp Download Organizer att spara till godtyckligt ställe i filsystemet så är det väl bara att mounta SMB-sharen på lämpligt ställe i filsystemet och peka RegExp dit?

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Aug 2001

Okej, så jag har ett skript som nästan fungerar...

#!/bin/bash inotifywait -m /home/user/Downloads/semesterbilder -e create -e moved_to | while read dir action file; do if [[ "$file" =~ .*jpg$ ]]; echo "found jpg"; then sleep 5 && mv /home/user/Downloads/semesterbilder/"$file" smb://share/"$file"; fi done

Utan "sleep" försöker den flytta filen innan den har sparats, så nedladdningen misslyckas. Med "sleep" får jag ändå irriterande felmeddelande som:

mv: cannot stat '/home/user/Downloads/semesterbilder/Unconfirmed 319647.crdownload': No such file or directory

Därefter felmeddelande som:

mv: cannot move '/home/user/yadayada/filnamn.jpg to 'smb://share...

Om jag ändrar 'smb://share..' till en lokal mapp fungerar det dock. Alltså, trots meddelandet så flyttas filen. Jag vet dock inte hur jag ska göra för att den ska vilja flytta filen över nätverket.

Har ni förslag på dels hur jag löser problemet och hur jag städar skriptets output?

Trädvy Permalänk
Medlem
Plats
SweClockers forum
Registrerad
Aug 2012
Skrivet av DasIch:

Okej, så jag har ett skript som nästan fungerar...

#!/bin/bash inotifywait -m /home/user/Downloads/semesterbilder -e create -e moved_to | while read dir action file; do if [[ "$file" =~ .*jpg$ ]]; echo "found jpg"; then sleep 5 && mv /home/user/Downloads/semesterbilder/"$file" smb://share/"$file"; fi done

Utan "sleep" försöker den flytta filen innan den har sparats, så nedladdningen misslyckas. Med "sleep" får jag ändå irriterande felmeddelande som:

mv: cannot stat '/home/user/Downloads/semesterbilder/Unconfirmed 319647.crdownload': No such file or directory

Därefter felmeddelande som:

mv: cannot move '/home/user/yadayada/filnamn.jpg to 'smb://share...

Om jag ändrar 'smb://share..' till en lokal mapp fungerar det dock. Alltså, trots meddelandet så flyttas filen. Jag vet dock inte hur jag ska göra för att den ska vilja flytta filen över nätverket.

Har ni förslag på dels hur jag löser problemet och hur jag städar skriptets output?

Se inlägget ovan. Varför har du inte monterat smb-sharen?

Guide: Roota din HTC - BB-Kod-knappar på Prisjakt

              Min burk - Kvävekyld till 80%
8700K@stock
1070 Ti@stock

Ibland har jag fel, men då är det någon annans fel.

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Aug 2001
Skrivet av LemonIllusion:

Se inlägget ovan. Varför har du inte monterat smb-sharen?

Den blir automagiskt mountad i /var/run/user/1000/gvfs/smb-share/ tydligen. Passar mig bra, pekar jag skriptet dit så fungerar det.

RegExp går bara att peka till default nedladdningsmapp och underliggande mappar och där vill jag inte montera smb-sharen.

Nu behöver jag bara putsa till skriptet och köra som en enkel service så blir det precis som jag vill ha det.

Problemen nu är meddelandena om "cannot stat" samt en ny variant:

mv: preserving permissions for ‘/run/user/1000/gvfs/smb-share:/.../semesterbild.jpg’: Operation not supported

Vet inte om det senare är ett problem. Förstår jag det rätt får filen de permissions jag satt på min smb-share, och det verkar bäst så.

Trädvy Permalänk
Medlem
Registrerad
Dec 2015
Skrivet av DasIch:

Den blir automagiskt mountad i /var/run/user/1000/gvfs/smb-share/ tydligen. Passar mig bra, pekar jag skriptet dit så fungerar det.

RegExp går bara att peka till default nedladdningsmapp och underliggande mappar och där vill jag inte montera smb-sharen.

Jag gissar att du i så fall kan lägga en symlänk i nerladdningsmappen. Så länge symlänken pekar på en mountad mapp så borde det fungera, men du kan nog (som du märkt) inte peka en symlänk på en UNC-path.

Trädvy Permalänk
Medlem
Registrerad
Dec 2015

Den automatskapade mountningen kommer nog för övrigt från Gnome. Den lever och dör antagligen med skrivbordsmiljön, vilket kanske kan fungera, men en egen mount där du kan styra rättigheterna efter eget huvud tycker jag verkar vettigare.

Cannot stat verkar hända eftersom browsern laddar ner en temporär fil (som plockas upp av inotify) och som sedan döps om till det riktiga filnamnet. Efter sleep finns temporärfilen inte längre kvar. Din if-sats som kollar om det är en jpg-fil verkar inte fungera. Mina bash-skills är begränsade men... ett semikolon för mycket och/eller ett then för lite?

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Aug 2001
Skrivet av KAD:

Den automatskapade mountningen kommer nog för övrigt från Gnome. Den lever och dör antagligen med skrivbordsmiljön, vilket kanske kan fungera, men en egen mount där du kan styra rättigheterna efter eget huvud tycker jag verkar vettigare.

Ja, stämmer nog att den automagiska monteringen kommer från Gnome. Jag känner inte att jag har tillräcklig koll på hur det funkar med rättigheter ifall jag ger den en egen monteringspunkt och rättigheterna sedan ändras. Vill minnas att jag bråkat med problem som uppkommit av det förut.

Citat:

Cannot stat verkar hända eftersom browsern laddar ner en temporär fil (som plockas upp av inotify) och som sedan döps om till det riktiga filnamnet. Efter sleep finns temporärfilen inte längre kvar. Din if-sats som kollar om det är en jpg-fil verkar inte fungera. Mina bash-skills är begränsade men... ett semikolon för mycket och/eller ett then för lite?

Det verkar som 'then' behövde hoppa upp en rad. Nu får jag visserligen fortfarande 'cannot stat' men den hugger rätt filer i varje fall. Såhär ser det ut nu:

#!/bin/bash inotifywait -m /home/user/semesterbilder -e create -e moved_to | while read dir action file; do if [[ "$file" =~ .*jpg$ ]]; then echo "Found" && cp /home/user/semesterbilder/"$file" \ /run/user/1000/gvfs/smb-share\:server\=tralala/semesterbilder/"$file" && rm /home/user/semesterbilder/"$file"; fi done

Jag ändrade från 'mv' till 'cp' och 'rm' för att slippa problem med permissions. Men fortfarande något som inte riktigt stämmer med tanke på 'cannot stat'.

Edit: Nu när hjärnan vaknat är det rätt uppenbart varför jag får "cannot stat" meddelandet. Är if-satsen sann kör ju skriptet loopen tills den misslyckas, och andra varvet runt finns ju inte filen kvar.

Trädvy Permalänk
Medlem
Registrerad
Nov 2005

Du kan även kolla in incrond https://wiki.archlinux.org/index.php/Incron
incron is a daemon which monitors filesystem events and executes commands defined in system and user tables.

Du borde dock kunna lösa det i chrome tycker man.