• Opret dig
  • Glemt adgangskode

User account menu

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

Snak med

Opret dig!

Af z4ndx | 02.07.2011 20:33

Lidt hjælp til "find"

Hjælp generelt
Hej.. Jeg har lige brug for lidt hjælp. Jeg er ved at lave et lille script der gør min dagligdag lidt nemmere.. Dog er jeg kommet lidt i stå.

Jeg vil gerne at "find" finder en fil og sletter mappen den er i.

Altså, leder jeg efter filen Blå.jpg, når "find" finder den skal den slette den mappe den er i.

Eks.

z4ndx@server:~$find . -type f -name "Blå.jpg" -print
./Kager/Blå.jpg

Så vil jeg gerne have at den sletter mappen "Kager"

Hvordan dælen gør jeg det ?
  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer24

# 1

13 år 12 måneder siden

Permalink

Indsendt af mrbrown79 den 2. juli 2011 kl. 21:01

Permalink

Du kunne jo udskrive

Du kunne jo udskrive direktorierne med find og sende outputtet videre til rm.

Fx. (utestet)

find -name filnavn.txt -printf "%h\n" | xargs rm -rf
  • Log ind eller opret dig for at tilføje kommentarer

# 2

13 år 12 måneder siden

Permalink

Indsendt af marlar den 2. juli 2011 kl. 21:10

Permalink

Du kom mig lige i

Du kom mig lige i forkøbet!

Følgende er afprøvet:

find . -type f -name "Blå.jpg" -printf %h | xargs rm -rf

Men pas altid på med kommandoer der indeholder rm -rf . Vær sikker på at du står det rigtige sted når du starter!
  • Log ind eller opret dig for at tilføje kommentarer

# 3

User picture for bbolinder_dk

13 år 12 måneder siden

Permalink

Indsendt af bbolinder_dk den 3. juli 2011 kl. 07:39

In reply to Du kom mig lige i by marlar

Permalink

En god måde er først at

En god måde er først at finde det du vil slette og se om det er det ønskede. Derefter gentager du din "find" kommando og udvider den med slette instrukserne.

Jeg gør normalt sådan:

find . -type f -name "Blå.jpg" -print

Når jeg så har set at det er det ønskede... gentager med "-exec rm -rf {} \;" " krøllet paranteser backslash og semicolon
altså

find . -type f -name "Blå.jpg" -print -exec rm -rf {} \;

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

# 4

13 år 12 måneder siden

Permalink

Indsendt af marlar den 3. juli 2011 kl. 10:11

Permalink

Dit råd med at printe

#3:

Dit råd med at printe første er godt og jeg bruger det selv. Dog er din kommando ikke korrekt i dette tilfælde, da det jo er mappen som indeholder filen der skal slettes, ikke bare selve filen.

Ideen kan sagtens videreføres til mit eksempel:

find . -type f -name "Blå.jpg" -printf %h | xargs echo rm -rf
  • Log ind eller opret dig for at tilføje kommentarer

# 5

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 3. juli 2011 kl. 15:03

Permalink

Det ser ud til at virke fint

Det ser ud til at virke fint :) .. Dog skal jeg lige have skåret det ud i pap.

"-printf %h" gør at den vælger den øverste mappe, korrekt?

Jeg har dog ikke helt forstået brugen af xargs, hvorfor ? Hvorfor ikke bare bruge -exec rm -rf {} \; ?
  • Log ind eller opret dig for at tilføje kommentarer

# 6

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 3. juli 2011 kl. 17:57

Permalink

Håber lidt der også er en

Håber lidt der også er en der kan hjælpe med en "if" i et bash script.
Jeg vil gerne:

if "resultatet af overstående find command er = 0" (den finder ingen filer med navnet Blå.jpg)
then
command
command

En der kan bikse lidt idet ?
  • Log ind eller opret dig for at tilføje kommentarer

# 7

13 år 12 måneder siden

Permalink

Indsendt af redeeman den 3. juli 2011 kl. 21:06

Permalink

if [[ "$(din find kommando)"

if [[ "$(din find kommando)" == "0" ]]; then
balblablaba
fi

men er du sikker på du ønsker == "0" ? og ikke "" ?

anyway.. sådan der er if syntaxen, for mere information, kør kommandoen "man test"
  • Log ind eller opret dig for at tilføje kommentarer

# 8

13 år 12 måneder siden

Permalink

Indsendt af marlar den 3. juli 2011 kl. 21:30

Permalink

"-printf %h" gør at den

#5: "-printf %h" gør at den vælger den øverste mappe, korrekt?

Nej, den vælger snarere den nederste mappe. Hvis strukturen er Mad/Dessert/Kager/Blå.jpg så returner den Mad/Dessert/Kager og sletter altså kun Kager og ikke Dessert mm.

Jeg har dog ikke helt forstået brugen af xargs, hvorfor ? Hvorfor ikke bare bruge -exec rm -rf {} \; ?

I princippet jo, men så får du ikke muligheden for at benytte mappenanvnet. rm -rf {} vil således kun slettet Blå.jpg (det efter -exec er uafhængig af -printf formatet!)
  • Log ind eller opret dig for at tilføje kommentarer

# 9

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 4. juli 2011 kl. 17:20

Permalink

redeeman @ Hvad er

redeeman @ Hvad er forskellen ?

marlar @ Det er sådan set også godt nok da jeg formentligt ikke kommer længere ned end en mappe. Men hva nu hvis jeg gerne vil slette hele stien. Altså egenligt bare mappen Mad. Kan fixe noget der?
  • Log ind eller opret dig for at tilføje kommentarer

# 10

13 år 12 måneder siden

Permalink

Indsendt af marlar den 4. juli 2011 kl. 17:30

Permalink

Men hva nu hvis jeg

#9: Men hva nu hvis jeg gerne vil slette hele stien. Altså egenligt bare mappen Mad

Er du klar over omfanget af en sådan sletning? Alle mapper under Mad slettes hvis der et eller andet sted i hierakiet findes en fil der hedder Blå.jpg. Er du nu sikker på at det er det du ønsker? Hvis du starter kommandoen et forkert sted kan du i princippet slette hele harddisken!
  • Log ind eller opret dig for at tilføje kommentarer

# 11

13 år 12 måneder siden

Permalink

Indsendt af redeeman den 4. juli 2011 kl. 17:55

Permalink

det er på den måde

#9:
det er på den måde sammenligning af strenge, 0 er anderledes end tom.
  • Log ind eller opret dig for at tilføje kommentarer

# 12

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 4. juli 2011 kl. 20:08

Permalink

marlar @ Hehe, så dropper

marlar @ Hehe, så dropper vi det bare :)

redeeman @ Hvad er forskellen?
  • Log ind eller opret dig for at tilføje kommentarer

# 13

13 år 12 måneder siden

Permalink

Indsendt af mrbrown79 den 4. juli 2011 kl. 22:04

Permalink

redeeman @ Hvad er

#12: redeeman @ Hvad er forskellen?

Så simple spørgsmål er sgu nemmere (og mere lærerige) at afprøve i en terminal end at formulere i et forum.

Budskabet er at der er forskel på "0" (som er en streng, der består af karakteren '0') og "" (som er en tom streng). I dit tilfælde skal du naturligvis sammenligne med en tom streng.

Hele dit script kunne så følge en struktur a'la dette:
#!/bin/bash

count=0
for rmdir in `find -name filnvn.txt -printf %h`
do
echo "Nu sletter jeg biblioteket" $rmdir
count=$((count+1))
done
if [ $count -lt 1 ]; then
echo "HEY! Der blev ikke slettet noget!"
fi
  • Log ind eller opret dig for at tilføje kommentarer

# 14

13 år 12 måneder siden

Permalink

Indsendt af frogmaster den 4. juli 2011 kl. 22:14

Permalink

Hvad er forskellen?
Nu

#12: Hvad er forskellen?

Nu er det ikke mig du spørger, men 0 er ikke det samme som "ingenting" => "".
Nul er numerisk og "" er alfanumerisk.

Måske kan du finde mere herfra - Unix Find Command Tutorial:
http://www.softpanorama.org/Tools/Find/find_mini_tutorial.shtml

Den omtaler også xargs
  • Log ind eller opret dig for at tilføje kommentarer

# 15

13 år 12 måneder siden

Permalink

Indsendt af redeeman den 5. juli 2011 kl. 05:14

Permalink

du kan selvfølgelig også

du kan selvfølgelig også tjekke exit status af en kommando, bare kør kommandoen og tjek $?
  • Log ind eller opret dig for at tilføje kommentarer

# 16

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 5. juli 2011 kl. 06:39

Permalink

Synes det er vildt du kan

Synes det er vildt du kan slynge sådan et script ud fra det blå :) .. Hvordan lærer man lige det?

Jeg har lidt problemer med at få denne linje til at fungere.

find . -type d -iname "Kager" -printf %h | xargs rm -rvf

Den sletter ikke mappen som "Kager" er i. Hvorfor ?
  • Log ind eller opret dig for at tilføje kommentarer

# 17

13 år 12 måneder siden

Permalink

Indsendt af marlar den 5. juli 2011 kl. 09:57

Permalink

find . -type d -iname

Den sletter ikke mappen som "Kager" er i. Hvorfor ?

-printf %h skriver navnet på den mappe som Kager befinder sig hvilket er "." og denne pseudomappe kan ikke slettes. I stedet skal du bruge

find . -type d -iname "Kager" -print | xargs rm -rfv

Som tidligere nævnt er det en god ide at bruge echo i stedet for rm så du kan se hvad der sker. Prøv derfor disse to kommandoer og bemærk forskellen:


find . -type d -iname "Kager" -print | xargs echo
find . -type d -iname "Kager" -printf %h | xargs echo

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

# 18

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 5. juli 2011 kl. 16:13

Permalink

Aaah jeg nu kan jeg se det

Aaah jeg nu kan jeg se det :) ..

Hmm der er noget jeg ikke helt forstår.

Når jeg kører denne command, find . -type d -iname "Kager" -printf %h | xargs rm -rfv, fungere den som den skal. Den sletter den mappe "Kager" ligger i.

Men i mit script gør den ikke. Det er i dette sammenhæng.


read -p "Delete the folders contaning Kager? [y/n] " -n 1
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo
read -p "Are you sure? [y/n] " -n 1
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo
find . -type d -iname "Kager" -printf %h | xargs rm -rfv
echo " Done.."
echo
else
echo
echo "Skipping.."
fi
else
echo
echo "Skipping.."
fi
fi
  • Log ind eller opret dig for at tilføje kommentarer

# 19

13 år 12 måneder siden

Permalink

Indsendt af mrbrown79 den 5. juli 2011 kl. 17:34

Permalink

Men i mit script gør

#18: Men i mit script gør den ikke

Og du er sikker på at scriptet når at afvikle kommandoen? Med andre ord: bliver der skrevet "Done.."?

EDIT: At dømme på det, du har kopieret ind, har jeg svært ved at se, hvad der sætter $REPLY...
  • Log ind eller opret dig for at tilføje kommentarer

# 20

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 5. juli 2011 kl. 18:07

Permalink

Yeps. der bliver skrevet

Yeps. der bliver skrevet "Done.."
  • Log ind eller opret dig for at tilføje kommentarer

# 21

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 6. juli 2011 kl. 17:10

Permalink

Ingen bud ?..

Ingen bud ?..
  • Log ind eller opret dig for at tilføje kommentarer

# 22

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 6. juli 2011 kl. 17:27

Permalink

Jeg har fundet problemet..

Jeg har fundet problemet..

Det består faktisk af 2 ting.
Den første er at hvis den øverste mappe, "Kager" ligge i, har et space/mellemrum i navnet kan den ikke slette den.

Den anden er. Hvis der er 2 eller flere mapper med som har "Kager" mappen i sig, kan den heller ikke finde ud af det.

Hvordan løser jeg lige det ?
  • Log ind eller opret dig for at tilføje kommentarer

# 23

13 år 12 måneder siden

Permalink

Indsendt af mrbrown79 den 6. juli 2011 kl. 18:11

Permalink

Den første er at hvis

#22: Den første er at hvis den øverste mappe, "Kager" ligge i, har et space/mellemrum i navnet kan den ikke slette den.
Formentlig ved at indsætte nogle anførselstegn.

find . -type d -iname "Kager" -printf '"%h"'

#22: Den anden er. Hvis der er 2 eller flere mapper med som har "Kager" mappen i sig, kan den heller ikke finde ud af det.
Muligvis mangler der en newline:
find . -type d -iname "Kager" -printf '"%h"\n' | xargs rm -rfv
eller en null-karakter gør sikkert også jobbet, men så skal xargs kildes lidt under hagen:
find . -type d -iname "Kager" -printf '"%h"\0' | xargs --null rm -rfv


Men vigtigst af alt. Husk nu at debug ved at sætte echo ind lige efter xargs. Så er du meget bedre rustet til at finde ud af, hvad der går galt.

EDIT: rettede nogle tegn efter afprøvning
  • Log ind eller opret dig for at tilføje kommentarer

# 24

13 år 12 måneder siden

Permalink

Indsendt af z4ndx den 6. juli 2011 kl. 21:16

Permalink

Super super super super

Super super super super fedt... Fantastisk hjælp jeg har fået af jer. :)
Troede virkelig ikke jeg ville få det løst.

find . -type d -iname "Kager" -printf '"%h"\0' | xargs --null rm -rfv
Virkede ikke.. Hverken på den ene eller på den anden...

Til gengæld virker den her fantastisk.
find . -type d -iname "Kager" -printf '"%h"\n' | xargs rm -rfv

Mange mange tak for alle jeres svar. Det er sku rart med noget prof hjælp når man selv hænger i vandskorpen. :P
  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

llumos Unix-operativsystem, 0
Den er go 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0
Linux fra begynder til professionel af O'Reilly 0

Seneste aktivitet

PCLinuxOS 26
Virtuel maskine? 1
Gode anmeldelser Zorin OS 17.3 3
Open Source-eksperimentet 3
Nulstilling af adgangskode 5
"Intet realistisk alternativ" - mig i r*ven 15
Ingen Mint 5
Linux App Store Flathub når 3 milliarder downloads 2
Digitaliseringsministeriet sætter gang i pilotprojekt om digital suverænitet 3
Mest sikker webbrowser 5
Firefox 2
Privatbeskeder 7
Backup/synkronisering? 3
BigLinux 5
Chatgpt satire 1
Læsning af databasefil i Firefox 2
Vanilla OS 15
Pepsi Challenge 4
Linuxin er nu migreret til Drupal 11 13
Et Dansk alternativ til Facebook 18

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !