• 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 10 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 10 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 10 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 10 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 10 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

GRUB 2.14 introducerer understøttelse af EROFS, forbedringer til Btrfs og LVM 0
KDE Plasma 6.6 tilføjer en funktion, som brugerne har spurgt efter i evigheder 0
Linux i København 12.01.2026: Open source i det offentlige 0
Dansk distro Omarchy 0
KDE overgår indsamlingsmålet for 2025 med rekordstor støtte fra lokalsamfundet 0

Seneste aktivitet

BigLinux 1
E-mail blues 6
Linux Mint 22.3 - hvornår opdatere? 10
Canon-printer: Jeg savner "Ink-Toner Level"-meddelelse 10
billede af nuværende installation 2
mapper 4
LinuxIn live 9
Linux Debian på ekstern HD 4
usb disk *LØST* 2
Pacman kunne erstattes af en anden Rust baseret mulighed 1
Epson skanner software 8
Debian 1
Printer Epson ET-2865 problem 8
Winboat 4
Nu kan man skrive private beskeder 14
Mint på imac 2009 34
Firefox AI 7
Kunstig inteligens 6
Kopiering til min Samsung telefon 9
Installation af programmer 21

© 2026 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !