• Opret dig
  • Glemt adgangskode

User account menu

  • Artikler
  • Forside
  • Forum
  • Nyheder
  • Log ind
Hjem
LinuxIN.dk

Snak med

Opret dig!

Af uldall | 25.02.2011 19:13

Hjælp til for-loop og cp

Programmering
Hej alle.
Jeg er ved at lave et script der kan gemme videoer fra fx Youtube på min computer.
Først findes programmets PID ved at køre

lsof | grep deleted | head -1 | awk '{ print $2 }'

Dette gemmes i en variabel kaldet $PID
Selve filerne findes i /proc/$PID/fd, så for at finde alle flash-filer køres følgende:

file $(find /proc/$PID/fd/ -print) | grep Flash | sort --u

Dette giver følgende output:

/proc/$PID/fd/17: broken symbolic link to `/tmp/FlashXXfPBaTM (deleted)'

Her får jeg altså både navnet på filen i /proc (/proc/$PID/fd/17) samt filens originale sti (/tmp/FlashXXfPBaTM).

Problem:
Jeg kunne nu godt tænke mig at lave et for-loop, der tager output af file-kommandoen og indsætter det i en cp-kommando, så kommandoen kommer til at lyde:

cp /proc/$PID/fd/17 /tmp/FlashXXfPBaTM


Herunder er scriptet i dens nuværende stand, som kopierer filer direkte. Dvs. at den kopierer /proc/$PID/fd/17 til /tmp/17 og ikke /tmp/FlashXXfPBaTM som ønsket.

PID=$(lsof | grep deleted | grep plugin-co | head -1 | awk '{ print $2 }')
for i in $(file $(find /proc/$PID/fd/ -print) | grep Flash | sort --u | awk '{ print $1 }' | sed 's/.$//')
do
echo "Now copying: $i to /tmp"
cp $i /tmp
echo "Done!"
done

  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer8

# 1

14 år 8 måneder siden

Permalink

Indsendt af Tom_the_ den 25. februar 2011 kl. 20:13

Permalink

Det er ikke for at være

Det er ikke for at være lyseslukker, men hvorfor ikke bare bruge firefox til at hente en fil fra youtube. De ligger da i mp4 format.
  • Log ind eller opret dig for at tilføje kommentarer

# 2

14 år 8 måneder siden

Permalink

Indsendt af mixi den 25. februar 2011 kl. 20:31

Permalink

Eller hvad med at bruge :

Eller hvad med at bruge : http://rg3.github.com/youtube-dl/
  • Log ind eller opret dig for at tilføje kommentarer

# 3

14 år 8 måneder siden

Permalink

Indsendt af uldall den 25. februar 2011 kl. 21:52

Permalink

Jep, jeg kender godt til

Jep, jeg kender godt til youtube-dl, men jeg lærer jo ingenting ved bare at bruge en andens program.

Og nu har jeg altså valgt et problem, som jeg mener kan løses med et for-loop, som dog driller.

Men tak for inputtet, hvis jeg havde haft et "reelt" problem og bare skulle have en hurtig løsning, var det de helt rigtige svar:-)
  • Log ind eller opret dig for at tilføje kommentarer

# 4

14 år 8 måneder siden

Permalink

Indsendt af mixi den 26. februar 2011 kl. 01:26

Permalink

okay... jeg undskylder, jeg

okay... jeg undskylder, jeg havde misforstået det, men så vidt jeg kan se fra dit kode eksemple, så mangler der et ";" i dit for-loop.
eksemple:

for i in $( ls ); do
echo item: $i
done

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html
  • Log ind eller opret dig for at tilføje kommentarer

# 5

14 år 8 måneder siden

Permalink

Indsendt af mrbrown79 den 26. februar 2011 kl. 13:01

Permalink

PID=$(lsof | grep deleted |


PID=$(lsof | grep deleted | grep plugin-co | head -1 | awk '{ print $2 }')
for i in $(file $(find /proc/$PID/fd/ -print) | grep Flash | sort --u | awk '{ print $1 }' | sed 's/.$//')
do
echo "Now copying: $i to /tmp"
cp $i /tmp
echo "Done!"
done


I sådan nogle tilfælde plejer jeg at bruge awk til at generere kommandolinjen og så pipe til shell'en (m.a.o: drop for-løkkerne).
Fx:

PID=$(lsof | grep deleted | grep plugin-co | head -1 | awk '{ print $2 }')
file $(find /proc/$PID/fd/ -print) | grep Flash | sort --u | sed -e 's/://g' -e 's/`//g' | awk '{ print "cp " $1 " " $6 }' | sh


Hvis du vil have den til at udskrive noget, så kan du jo udbygge awk-linjen efter bedste evne - fx:

file $(find /proc/$PID/fd/ -print) | grep Flash | sort --u | sed -e 's/://g' -e 's/`//g' | awk '{ print "printf \"Copying " $1 "...\""; print "cp " $1 " " $6 " && echo Done!"; }' | sh


Anyway, hvis du foretrækker for-loops, så burde det være muligt at tildele flere argumenter i stil med eksempel 11.2 her: http://tldp.org/LDP/abs/html/loops1.html . Jeg har dog ikke haft held med at få det til at virke.

  • Log ind eller opret dig for at tilføje kommentarer

# 6

14 år 8 måneder siden

Permalink

Indsendt af uldall den 26. februar 2011 kl. 13:24

Permalink

Så fik jeg den næsten

Så fik jeg den næsten ordnet, men et nyt problem er opstået:

Jeg har nu fået den til at kopiere en enkelt fil som jeg gerne vil have det, men modsat scriptet i min første post, begynder den ikke automatisk på næste fil.

Jeg går stærkt ud fra, at det har noget at gøre med, at jeg sætter gåseøjne (") omkring et flerlinjet output i dette stykke:

for i in "$(file $(find /proc/$PID/fd/ -print) | grep Flash | sort -u)";

I mit tilfælde ved jeg, at der ligger 3 flash-filer i /proc/$PID/fd/.

Her er scriptet som det ser ud nu:

#!/bin/bash
# Variables
PID=$(lsof | grep deleted | grep plugin-co | head -1 | awk '{ print $2 }')
COUNT=$(file $(find /proc/$PID/fd/ -print) | grep Flash | sort -u | wc -l)

# Script
echo "PID is $PID and we got $COUNT files to copy..."
for i in "$(file $(find /proc/$PID/fd/ -print) | grep Flash | sort -u)";
do
# Variables
PROC=$(echo $i | awk '{ print $1 }' | sed 's/.$//')
TMP=$(echo $i | awk '{ print $6 }' | cut -c2-)
# Commands
echo "Now copying: $PROC to $TMP"
cp $PROC $TMP
echo "Done!"
done
  • Log ind eller opret dig for at tilføje kommentarer

# 7

14 år 8 måneder siden

Permalink

Indsendt af mrbrown79 den 26. februar 2011 kl. 13:46

Permalink

Jeg går stærkt ud fra, at


Jeg går stærkt ud fra, at det har noget at gøre med, at jeg sætter gåseøjne (") omkring et flerlinjet output i dette stykke:

Ja, præcis. Løkken afvikles kun en enkelt gang, så (prøv at echo $i for at se om den indeholder multiple linjer når der er flere filer).

Så du mit indlæg #5 inden du skrev?
  • Log ind eller opret dig for at tilføje kommentarer

# 8

14 år 8 måneder siden

Permalink

Indsendt af uldall den 26. februar 2011 kl. 15:01

Permalink

(prøv at echo $i for at se

Nej, jeg så ikke dit indlæg før jeg postede, men det virker i hvert fald som det skal, når jeg kører din kommando, jeg har dog udbygget den lidt, så den printer en tekst der ligger mere op ad hvad jeg havde tænkt mig. Jeg havde slet ikke tænkt på, at awk ville kunne klare problemet.

Jeg har før kørt echo $i, hvilket bekræfter min hypotese om at den indeholder flere linjer.

Min modifikation af din kommando-linje ser således ud:

#!/bin/bash

# Variables
PID=$(lsof | grep deleted | grep plugin-co | head -1 | awk '{ print $2 }')
COUNT=$(file $(find /proc/$PID/fd/ -print) | grep Flash | sort -u | wc -l)

# Script
echo "PID is $PID and we have $COUNT files to copy..."
file $(find /proc/$PID/fd/ -print) | grep Flash | sort -u | sed -e 's/://g' -e 's/`//g' | awk '{ print "printf \"Copying " $1 " to " $6 "...\""; print "cp " $1 " " $6 " && echo Done!"; }' | sh
echo "Done copying $COUNT files."

  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

Østrigsk ministerium smider Microsoft ud til fordel for Nextcloud 0
Internettet er ved at dø. Vi kan stadig stoppe det 0
Tid til at lære noget igen 0
TPM 2 0
BigLinux 0

Seneste aktivitet

Brug carburetor til at forblive usynlig online 8
Sådan konfigurerer du flatpaks' flathub til verified only 9
Plasma tapet-skifter 3
How to upgrade to LMDE 7 4
Virksomheder og enheder der kører på Linux 11
NordVPN har udgivet kildekoden til sin grafiske brugergrænseflade 2
Flere og flere bruger Brave browseren 1
LibreOffice og Collabora: Hvorfor er de ikke i skolerne i stedet for Word og Google Docs? 11
Firewall igen 5
Værdien ved open source 2
Sailfish på android telefon 1
Ladybird Browser 7
Satiriske ordspil 3
Kan ikke boote på installation 26
Tilføj signatur til Evolution mail 2
LUKS kryptering - Er der andre der bruger det 15
Dansk distro til software udviklere 2
Linux Debian 5
Brother printer installation 2
Den er go 6

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !