Liste le contenu d'un volume : Aie avec les applications !

Nitiel

Membre expert
Club iGen
15 Mars 2008
1 029
38
Bonjour,

Je suis en train de créer un script afin d'avoir une liste du contenu d'un volume cible en excluant les fichiers cachés. Ma version actuelle fonctionne. Le seul problème est l'impossibilité de répertorier les applications qui sont des dossiers. Je ne sais pas du tout de quelle manière m'y prendre pour les listés sans listé aussi l'intérieure.

Si le volumes contient uniquement des fichiers, cela fonctionne, j'obtient ça :

Bloc de code:
Liste du contenue de « Cle » fait le lundi 27 août 2012 à 19:24:35.

Liste ouverte.

/Cle/À-faire.txt
/Cle/Dosiers B/Fichier B.doc
/Cle/Fichier A.txt

Liste fermer.

Si le volumes contient des fichiers et des applications, ça ne fonctione plus, j'obtient ça :

Bloc de code:
Liste du contenue de « Cle » fait le lundi 27 août 2012 à 19:23:13.

Liste ouverte.

/Cle/À-faire.txt
/Cle/Dosiers B/Fichier B.doc
/Cle/Fichier A.txt
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app/Contents/Info.plist
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app/Contents/MacOS/applet
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app/Contents/PkgInfo
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app/Contents/Resources/applet.icns
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app/Contents/Resources/applet.rsrc
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app/Contents/Resources/description.rtfd/TXT.rtf
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app/Contents/Resources/Scripts/main.scpt

Liste fermer.

Mon but est d'obtenir çà :

Bloc de code:
Liste du contenue de « Cle » fait le lundi 27 août 2012 à 19:23:13.

Liste ouverte.

/Cle/À-faire.txt
/Cle/Dosiers B/Fichier B.doc
/Cle/Fichier A.txt
/Cle/Support du TRIM pour 10.8.1 et 10.7.5.app

Liste fermer.

Mon script shell actuel :

Bloc de code:
#!/bin/bash
#
# Dernière modification : lundi 27 août 2012.


volumeChoisi="$*"
volumeChoisiEspaceParTiret=$(echo "$volumeChoisi" | sed 's/ /-/g')
cheminDuVolumeChoisi="/Volumes/$volumeChoisi"
dateLongue=$(date "+%A %d %B %Y à %H:%M:%S" | tr '[A-Z]' '[a-z]')
dateCourte=$(date "+%A %d %B %Y à %H:%M:%S" | tr '[A-Z]' '[a-z]') 
fichierDeSortie="À-faire.txt"


if [[ -n "$volumeChoisi" ]]
  then
	
	if [[ `ls /Volumes | grep "$volumeChoisi"` == "$volumeChoisi" && -r "$cheminDuVolumeChoisi" ]]
	  then
		
		if [[ -w "$cheminDuVolumeChoisi" ]]
		  then cd "$cheminDuVolumeChoisi"
		  else cd "$HOME"
		fi
		
		echo "Liste du contenue de « "$volumeChoisi" » fait le $dateLongue."		> $fichierDeSortie
		echo ""										>> $fichierDeSortie
		echo "Liste ouverte."								>> $fichierDeSortie
		echo ""										>> $fichierDeSortie

		find "$cheminDuVolumeChoisi"/* ! -iname ".*" -type f | sed "s/^\/Volumes//g"	>> $fichierDeSortie
		
		echo ""										>> $fichierDeSortie
		echo "Liste fermer."								>> $fichierDeSortie
		
		echo "Listage de « $volumeChoisi » terminé !"
		
		exit
		
  	  else
		
		echo "Le volume n'existe pas ou n'est pas accessible en lecture."
		
		exit
		
	fi
	
  else
	
	echo "Aucun volume choisi."
	
	exit
	
fi

Peut-être faudrait-il utiliser une autre commande que « find » ou s’en passer en écrivant un truc à la main. Comment faire ?

J'attend votre aide. Nicolas.
 
Dernière édition:
En python on peut faire qqch comme ça :

Bloc de code:
import sys, os;

# Get sorted files list without .DS_Store file
def list_directory(p_path, p_reverse=True):
	listing = os.listdir(p_path)
	if ".DS_Store" in listing:
		listing.remove(".DS_Store")
	return sorted(listing, None, None, p_reverse)

if len(sys.argv) != 2:
	sys.exit(1)

print list_directory(sys.argv[1])

Bloc de code:
python list.py /Path/to/directory

Faut adapter pour stripper les fichiers invisibles, mais c'est pas sorcier.
 
@Nyx0uf : J'ai essayé ton script et il ne donne que le premier niveau. Il ne poursuit pas dans les dossiers. Par contre, il a l'avantage de ne pas poursuivre dans une application. Je ne connais pas trop la syntaxe de python et préfère approfondir les Scripts Shell. Même comparer à l'Apple Script, je les trouve beaucoup plus simples, notamment pour écrire un fichier.

J'ai légèrement amélioré les choses. Après la première recherche, s’il détecte des « .app », il les supprime puis relance une recherche pour lister seulement les applications sans les approfondir. Le seul problème est qu'il les rajoute à la fin. Je n'arrive pas à organiser alphabétiquement toute les lignes avec la commande « sort » dès qu'il y a plusieurs niveaux à trier.

J'ai peut-être découvert la solution. Elle reprendrait grosso modo les commandes actuelles en ajoutant une boucle « for ». Je l'écris dans les prochains jours et la posterai en espérant qu'elle soit bonne.

Le script modifié :

Bloc de code:
#!/bin/bash
#
# Dernière modification : mardi 28 août 2012.


volumeChoisi="$*"
volumeChoisiEspaceParTiret=$(echo "$volumeChoisi" | sed 's/ /-/g')
cheminDuVolumeChoisi="/Volumes/$volumeChoisi"

dateLongue=$(date "+%A %d %B %Y à %H:%M:%S" | tr '[A-Z]' '[a-z]')
#dateCourte=$(date "+%d-%m-%Y %H:%M:%S") 

fichierTemporaire="/private/var/tmp/fichierTemporaire"
fichierDeSortie=Contenue-de-"$volumeChoisiEspaceParTiret".txt


if [[ -n "$volumeChoisi" ]]
  then
	
	if [[ `ls /Volumes | grep "$volumeChoisi"` == "$volumeChoisi" && -r "$cheminDuVolumeChoisi" ]]
	  then
		
		echo "Listage de « $volumeChoisi » commencé !"
		
		if [[ -w "$cheminDuVolumeChoisi" ]]
		  then cd "$cheminDuVolumeChoisi"
		  else cd "$HOME"
		fi

		find "$cheminDuVolumeChoisi"/* ! -iname ".*" -type f | sed "s/^\/Volumes//g" | sed "/\/*.app\//d"	>  $fichierTemporaire
		find "$cheminDuVolumeChoisi"/* -iname "*.app" -type d | sed "s/^\/Volumes//g"				>> $fichierTemporaire
		
		echo "Liste du contenue de « "$volumeChoisi" » fait le $dateLongue."	>  $fichierDeSortie
		echo ""									>> $fichierDeSortie
		echo "Liste ouverte."							>> $fichierDeSortie
		echo ""									>> $fichierDeSortie
		sed -n "/^\//p" "$fichierTemporaire" | sort -d				>> $fichierDeSortie # Problème avec sort
		rm "$fichierTemporaire"
		echo ""									>> $fichierDeSortie
		echo "Liste fermer."							>> $fichierDeSortie
		
		echo "Listage de « $volumeChoisi » terminé !"
		echo "Listage de « $volumeChoisi » sauvegardé dans « ""$cheminDuVolumeChoisi » !"
		
		exit
		
  	  else
		
		echo "Le volume n'existe pas ou n'est pas accessible en lecture."
		
		exit
		
	fi
	
  else
	
	echo "Aucun volume choisi."
	
	exit
	
fi
 
Dernière édition:
lapin en sucre

ecrit donc une function isBundle qui filtre sur l'extension
if dir && filename in bundle ext return 1

if dir && !isBundle -> continue recursive reading