• Opret dig
  • Glemt adgangskode

User account menu

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

Snak med

Opret dig!

Af marlar | 10.10.2011 11:49

Finde filer af en bestemt type ud fra indholdet?

Software
Som nævnt i denne tråd http://www.linuxin.dk/node/18913 har jeg genoprettet en masse filer fra en overskrevet NTFS partition.

Som altid når man gør dette, er mange af filerne ren junk selv de tilsyneladende er ok. Men når man så klikker på dem vil de ikke åbnes.

Derfor har jeg brug for at detektere hvilke af filerne som sandsynligvis er ok.

Kommandoen file kan bruges til dette, fx skriver den for gyldig fil (idet pptx-filer i virkeligheden er zip containere):

file Presentation.pptx
Presentation SAS.pptx: Zip archive data, at least v2.0 to extract


For en ugyldig skriver den bare data.

Mit spørgsmål er nu hvordan jeg kombinerer dette med find så den kopierer/flytter filer som genkendes af file kommandoen?

Hvis der er helt andre metoder, hører jeg også gerne om dette!
  • Log ind eller opret dig for at tilføje kommentarer

Kommentarer9

# 1

13 år 8 måneder siden

Permalink

Indsendt af marx den 10. oktober 2011 kl. 12:42

Permalink

Det er en værre pickle. Jeg

Det er en værre pickle. Jeg sad selv med dette da jeg skulle redde vores slettede filer ud fra vores fællesdrev på arbejdet. Alt var i flade filer med blocknumre og ingen filextension, så jeg var nødt til at skrive en mængde scripts der løb hver eneste fil igennem, checkede deres mimetype, checkede om deres data var intakt, og så flytte og rename dem, den kunne redde. Det var en større øvelse, men det var også en lidt mere kompleks omgang end jeg tror din situation er.

Det du gerne vil er basically at analysere på outputtet af find, hvorvidt der står "data" eller "noget andet". Hvis "noget andet" skal filen flyttes til en safe-mappe.

Personligt ville jeg strikke et PHP-script sammen til formålet. noget ala


foreach(glob('filerderskalanalyseres/*.pptx') as $filename){
ob_start();
system('file ' . $filename);
$output = ob_get_clean();
if($output!='data'){
system('mv ' . $filename . ' /den/folder/det/nu/skal/ligge/i');
}
}

det ovenstående skal tweakes til at passe situationen. fx tager den kun højde for pptx-filer, og den går ud fra at outputtet på korrupte filer er *præcist* strengen "data". dvs hvis der er whitespace før og efter, eller hvis der er noget "error:" eller hvis filnavnet er med i, så vil den flytte hver eneste fil. Så du skal lave en regular expression der passer præcist på det du forventer at få ud, ved en fejl.
  • Log ind eller opret dig for at tilføje kommentarer

# 2

13 år 8 måneder siden

Permalink

Indsendt af dudsen den 10. oktober 2011 kl. 13:16

Permalink

quick and dirty bash


for i in `find *pox*`; do
ii=`file $i | grep -v data`;
if [ "$ii" != "" ];
then cp $i /newdisk/dir/;
fi;
done;


erstat find *pox* med din find streng og /newdisk/dir/ med det korrekte.

grep -v svarer til at søge efter hvis strengen ikke findes i file outputtet du kan selv tilpasse grep regexp.
Edit så at data faktisk indgår i outputtet for excel så du skal nok leje lidt mere med grep for kun at fange de filer der faktisk er invalide. der er også nogle filer som file repportere som data der ikke er korrupte.
grep -v ": data$" er et bedre bud end ovenstående.
  • Log ind eller opret dig for at tilføje kommentarer

# 3

13 år 8 måneder siden

Permalink

Indsendt af marlar den 10. oktober 2011 kl. 13:23

Permalink

Tak for ideen!Jeg var alt

#1:

Tak for ideen!

Jeg var alt for fokuseret på bash scripting som jeg ikke har ret godt styr på og tænkte slet ikke i php-baner som er mit ekspertområde.

Dit forslag kan bruges stort set uændret:

#!/usr/bin/php
<?php
foreach(glob('*.pptx') as $filename){
ob_start();
system('file ' . "'$filename'");
$output = ob_get_clean();
#echo $output;
if(preg_match('/Zip archive data, at least v2\.0 to extract/', $output)){
system('echo found: ' . $filename . "\n");
system('cp ' . "'$filename'" . ' ok-files');
}
}
?>


Og det kan let modificeres til fx word-dokumenter:

#!/usr/bin/php
<?php
foreach(glob('*.doc') as $filename){
ob_start();
system('file ' . "'$filename'");
$output = ob_get_clean();
#echo $output;
if(preg_match('/Template: .*\.dot/', $output)){
system('echo found: ' . $filename . "\n");
system('cp ' . "'$filename'" . ' ok-files');
}
}
?>

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

# 4

13 år 8 måneder siden

Permalink

Indsendt af marlar den 10. oktober 2011 kl. 13:35

Permalink

Det ser også ud til at

#2:

Det ser også ud til at kunne virke, men der er problemer med filer som indeholder mellemrum. Det får file i linje 2 til at fejle.
  • Log ind eller opret dig for at tilføje kommentarer

# 5

13 år 8 måneder siden

Permalink

Indsendt af m_abs den 10. oktober 2011 kl. 14:32

Permalink

Så sæt gåseøjne

#4:
Så sæt gåseøjne rundt om $i
  • Log ind eller opret dig for at tilføje kommentarer

# 6

13 år 8 måneder siden

Permalink

Indsendt af marlar den 10. oktober 2011 kl. 14:39

Permalink

Så sæt gåseøjne

#5: Så sæt gåseøjne rundt om $i

Det var min første indskydelse men det virkede ikke. Rodede dog ikke videre derefter idet php-løsningen fungerer fint.
  • Log ind eller opret dig for at tilføje kommentarer

# 7

13 år 8 måneder siden

Permalink

Indsendt af dudsen den 10. oktober 2011 kl. 15:49

Permalink

Det var min første

#6: Det var min første indskydelse men det virkede ikke. Rodede dog ikke videre derefter idet php-løsningen fungerer fint.


Det eneste jeg er kommet fremtil er at bash variabler er noget hø hvis du har mellemrum. da bash tilkytter en semantisk betyding til whitespaces.

det virker fint med find|sed 's/ /\\ g/' hvis du forsøger at putte det i en variabel forsvinder \ og newline chars.
  • Log ind eller opret dig for at tilføje kommentarer

# 8

13 år 8 måneder siden

Permalink

Indsendt af marlar den 10. oktober 2011 kl. 15:53

Permalink

Det eneste jeg er kommet

#7: Det eneste jeg er kommet fremtil er at bash variabler er noget hø hvis du har mellemrum. da bash tilkytter en semantisk betyding til whitespaces

I det hele taget synes jeg bash har en forfærdelig syntaks. Det er derfor jeg aldrig er kommet længere end til noob stadiet! Det irriterer mig, og så har jeg svært ved at tage mig sammen til at lære det ordentligt.
  • Log ind eller opret dig for at tilføje kommentarer

# 9

13 år 8 måneder siden

Permalink

Indsendt af dudsen den 10. oktober 2011 kl. 20:01

Permalink

I det hele taget synes

#8: I det hele taget synes jeg bash har en forfærdelig syntaks. Det er derfor jeg aldrig er kommet længere end til noob stadiet!


For mig er det ikke så meget syntaksen men mere de underlige særheder der hele tiden er og ikke rigtigt er dokumenteret, jeg har selv problemer med at overskue lidt større ting, er primært breakfix tekniker og ikke programør.
  • Log ind eller opret dig for at tilføje kommentarer

Svar søges

Gode anmeldelser Zorin OS 17.3 0
Linux App Store Flathub når 3 milliarder downloads 0
llumos Unix-operativsystem, 0
Den er go 0
14. februar = I Love Free Software Day 0

Seneste aktivitet

Mest sikker webbrowser 3
Digitaliseringsministeriet sætter gang i pilotprojekt om digital suverænitet 1
Firefox 2
Ingen Mint 4
Privatbeskeder 7
Backup/synkronisering? 3
BigLinux 5
Chatgpt satire 1
Læsning af databasefil i Firefox 2
Vanilla OS 15
Pepsi Challenge 4
"Intet realistisk alternativ" - mig i r*ven 10
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
ExplainingComputers? 2

© 2025 Linuxin og de respektive skribenter

Oprettet og drevet af nørder siden 2004 !