Visualizzazione post con etichetta file. Mostra tutti i post
Visualizzazione post con etichetta file. Mostra tutti i post

domenica 15 maggio 2011

BASH: iterare sui file presenti in una cartella

Può essere molto utile riuscire a scandire i file presenti in una cartella in modo da automatizzare le nostre operazioni, soprattutto quelle che compiamo in modo ripetitivo su molti file.
  for f in directory_name/*
do
echo $f
done

In questo caso semplicemente scandiamo i file presenti nella cartella directory_name e ne stampiamo il nome.
Per comprendere il funzionamento di questo ciclo è importante notare che la parola chiave in è seguita dalla stringa directory_name/* e non dal solo nome della directory: il for di bash non è in grado di guardare direttamente dentro una cartella, in questo caso l'asterisco (come carattere jolly o wildcard) che segue il nome della directory definisce un insieme (l'insieme di di tutti i file presenti nella directory indicata). Il for di Bash, nella forma che sfrutta la parola chiave in, agisce sempre su un insieme.

Io, ad esempio, ho sfruttato questo costrutto per calcolare tutti gli md5sum dei file presenti in una cartella specificata come parametro.
  #!/bin/bash

#md5sum-all.sh

# check if one parameter is passed
if [ ${#} -ne 1 ] ; then
echo -e "[md5sum-all.sh] Usage: ./md5sum-all.sh directory_path\n"
exit 1
fi

# check if the parameter defines a valid directory path
if [ -d ${1} ] ; then
echo -e "Starting md5sum computing..."
else
echo -e "[md5sum-all.sh] Error: ${1} is not a valid path\n"
exit 1
fi

for f in ${1}/*
do
#check if f is a regular file (not directory, not device)
if [ -f $f ] ; then
md5sum $f
fi
done

exit 0

sabato 2 ottobre 2010

BASH: verifica esistenza file o directory

Verifichiamo se il file temp.txt esiste:
 if [ -f temp.txt ]; then 
echo "temp.txt esiste."
else
echo "temp.txt NON esiste."
fi
Verifichiamo se la directory TEMP esiste, in caso negativo la creiamo:
 if [ -d TEMP ]; then 
echo "TEMP esiste."
else
mkdir TEMP
fi

Invertiamo if ed else:
 if [ ! -f temp.txt ]; then 
echo "temp.txt NON esiste."
else
echo "temp.txt esiste."
fi

if [ ! -d TEMP ]; then
mkdir TEMP
else
echo "TEMP esiste."
fi

Il seguente script completo verifica l'esistenza di un file passato come argomento:
 #!/bin/bash 

# verifica che il numero di argomenti dello script
# sia esattamente uno
if [ ${#} -ne 1 ] ; then
echo "Specificare il file da verficare."
exit 1
fi

if [ -f ${1} ]; then
echo "Il file esiste."
else
echo "Il file NON esiste."
fi

exit 0

domenica 28 marzo 2010

JAVA: scrivere un file di testo

Come scrivere un semplice file di testo in Java.

Il primo passo consiste nell'importare le classi che ci serviranno:
 import java.io.File; 
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.IOException;

Subito dopo è possibile inserire il seguente codice nel metodo in cui vogliamo scrivere il file (al posto del nome del file può, naturalmente, essere utilizzata una variabile di tipo String opportunamente inizializzata):
  File f = new File("output.txt"); 
try {
if(!f.exists()) {
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(f);
PrintStream ps = new PrintStream(fos);

ps.println( "Prima riga" );
ps.println( "Seconda riga" );
}
catch(FileNotFoundException fnfex) {
//TODO: aggiungere qui gestione eccezione
}
catch(IOException ioex) {
//TODO: aggiungere qui gestione eccezione
}

Con questo codice è possibile scrivere un file di testo in modalità sovrascrittura (il testo precedentemente presente nel file verrà sovrascritto e quindi perso).
L'utilizzo della classe PrintStream permette di scrivere sul file come se si stesse scrivendo sullo standard output (come si fa quando si utilizza System.out.println).

JAVA: leggere un file di testo

Come leggere un semplice file di testo in Java, una riga alla volta.

Il primo passo consiste nell'importare le classi che ci serviranno:
 import java.io.File; 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;

Subito dopo è possibile inserire il seguente codice nel metodo in cui vogliamo leggere il file (al posto del nome del file può, naturalmente, essere utilizzata una variabile di tipo String opportunamente inizializzata):
  File f = new File("input.txt"); 
try {
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line = br.readLine();
while(line!=null) {
//TODO: aggiungere qui operazione sulla
// stringa letta
line = br.readLine();
}
}
catch(FileNotFoundException ex) {
//TODO: aggiungere qui gestione eccezione
}
catch(IOException ex) {
//TODO: aggiungere qui gestione eccezione
}

Con questo codice è possibile leggere un qualsiasi file di testo una riga alla volta. E' possibile agire sulle stringhe lette aggiungendo dove indicato il codice (o l'invocazione di un metodo) con il quale si realizzano le operazioni richieste.
Raggiunta la fine del file br.readLine() restituisce null.