• Opret dig
  • Glemt adgangskode

User account menu

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

Snak med

Opret dig!

Af marlar | 16.03.2011 15:14

Hvordan sletter man alle hardlinkede filer i en bestemt mappe? [LØST]

Software
Når jeg laver backup med rsync bruger jeg parametren --link-dest som opretter hardlinks til filer som allerede findes i destinationen. Derved opnår man at have en række backups som hver især er at betragte som en fuld backup uden dog at tage andet plads op end de nye og ændrede filer. Det fungerer rigtigt godt.

Nu vil jeg dog rydde op i min backup og er stødt på et problem!

Jeg har måske 10-12 forskellige udgaver af en mappestruktur hvor som sagt de ens filer blot er hardlinkede. Så når jeg sletter filer og mapper jeg ikke skal bruge, så forsvinder de slet ikke, tælleren formindskes bare med en. Først når ikke flere hardlinks peger på filerne, forsvinder de.

Dette er jo helt efter bogen. Spørgsmålet er nu hvordan jeg på en snild måde kan slette alle filerne sådan at de ryger væk på tværs af hardlinks!

Jeg kender godt til inodes og -samefile optionen til find, men jeg har hundredevis af disse filer så det vil være en gevaldig opgave at jagte dem manuelt en for en.

I stedet må det være muligt at lave en kommando/script som virker således:

1. Find alle hardlinkede filer i en vis mappestruktur
2a. For alle fundne filer, find og slet alle hardlinkede udgaver, eller
2b. Slet den pågældende inode direkte hvis det er muligt

Nogen hints til en sådan kommando?
  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer5

# 1

14 år 3 måneder siden

Permalink

Indsendt af julemand101 den 16. marts 2011 kl. 16:16

Permalink

Forstår jeg dig ret hvis

Forstår jeg dig ret hvis jeg antager at det du vil er at slette alle filer med det samme inode nummer? Fordi i så fald fandt jeg denne lille artikel:
http://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

Hvor det lader til du kan bruge kommandoen:
find . -inum [inode-number] -exec rm -i {} \;
  • Log ind eller opret dig for at tilføje kommentarer

# 2

14 år 3 måneder siden

Permalink

Indsendt af marlar den 16. marts 2011 kl. 17:20

Permalink

Du forstår mig sådan set

Du forstår mig sådan set ret, omend ikke hele omfanget :-)

Jeg kender godt den pågældende kommando, men jeg har hundredevis af filer som hver især har en del hardlinks. Så skal jeg med andre ord udføre kommandoen nogle hundrede gange, og det orker jeg lissom ikke!

Det jeg er på udkig efter er et script eller en kommando som gør det samme for alle hardlinkede filer i en specifik mappe.

Jeg har så i mellemtiden tænkt over en anden algoritme end nævnt i #0 som er mere effektiv:

1. Brug find kommandoen + fx awk til at lave en oversigt over alle hardlinkede filer i mappen, eller evt. på hele partitionen; der skal kun bruges inode + fuld sti til filerne.
2. Med udgangspunkt i den genererede fil skal der så slettes alle filer der delere inode med filerne i en bestemt mappe.

Fordelen her er at mapperne ikke skal gennemløbes en masse gang.
  • Log ind eller opret dig for at tilføje kommentarer

# 3

14 år 3 måneder siden

Permalink

Indsendt af m_abs den 16. marts 2011 kl. 19:08

Permalink

Du kunne gøre noget i stil

Du kunne gøre noget i stil med det her:

#Lav en liste over filer med deres inodes
find /sti/til/backup -type f -exec ls -i '{}' \; > file_list

#Lave en liste over de inode numre du vil af med antager af dir_to_delete er navnet på en undermappe til backup-stien
$inode_list = $(grep "dir_to_delete" file_list | cut -d" " -f1 | sort -u);

for inode in $inode_list; do
for file in $( cat file_list | grep "^$inode" | cut -d" " -f2 ); do
rm -v "$file"
done
done


Jeg tager intet ansvar for om det virker :) Jeg forudser dog nogle problemer med mellemrum i filnavne.
  • Log ind eller opret dig for at tilføje kommentarer

# 4

14 år 3 måneder siden

Permalink

Indsendt af marlar den 18. marts 2011 kl. 10:54

Permalink

Det ser umiddelbart godt ud

Det ser umiddelbart godt ud og er i hvert fald en god start. Vil prøve det senere i dag.
  • Log ind eller opret dig for at tilføje kommentarer

# 5

14 år 3 måneder siden

Permalink

Indsendt af marlar den 18. marts 2011 kl. 14:57

Permalink

Det virker! Jeg skulle kun

Det virker! Jeg skulle kun lige rette nogle syntaxfejl - men bash er også irriterende besværlig med syntax. Fx tillader den ikke mellemrum på hver side af lighedstegnet.


#!/bin/bash
dir_to_delete="/7kjbxus1.default.bak";
inode_list=$(grep "$dir_to_delete" file_list | cut -d" " -f1 | sort -u)
for inode in $inode_list; do
for file in $( cat file_list | grep "^$inode" | cut -d" " -f2 ); do
#rm -v $file
echo $file
done
done


Læg mærke til at jeg har skrevet echo i stedet for rm. Det gør jeg altid mens jeg tester scripts for at undgå ulykker :-)

Eneste der mangler er at den også sletter de tomme mapper. De bliver ladt tilbage nu. Det skyldes jo -type f som derved kun finder filerne og ikke mapperne.

Enten kan man køre hele herligheden to gange hvor man først går efter filer og så mapperne (hvis man gør det i samme kørsel går der måske ged i det fordi man sletter mapper før filer). Eller man kan evt slette tomme mapper med:


find . -depth -type d -empty -delete


1000 tak :)
  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

Gode anmeldelser Zorin OS 17.3 0
llumos Unix-operativsystem, 0
Den er go 0
14. februar = I Love Free Software Day 0
Lokal fil-deling - for de dovne. 0

Seneste aktivitet

"Intet realistisk alternativ" - mig i r*ven 12
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
Ekstern Blu-ray-brænder, der fungerer med PCLinuxOS 3
Københavns og Aarhus Kommune dropper MS 9
Open Source-eksperimentet 1
Microsoft og Google ud af de danske skoler 2
Udfordringer med lydin på Debian 12 1

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !