2009-06-02 8 views
0

Quelle syntaxe dois-je utiliser dans un script bash pour lister les fichiers basé sur 3 valeurs dynamiques: - plus de X jours - dans un répertoire spécifié - dont le nom contient une chaîne spécifiée ?bash: Comment délimiter les chaînes pour trouver les fichiers

FILEAGE=7 
FILEDIR='"/home/ecom/tmp"' 
FILESTRING='"search-results-*"' 
FILES_FOR_REMOVAL=$("/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;") 
echo ${FILES_FOR_REMOVAL} 

Si j'essaie ci-dessus je reçois:

-bash: /usr/bin/find "/home/ecom/tmp" -maxdepth 1 -type f -mtime +7 -name "search-results-*" -exec ls -lth {} \;: No such file or directory 
+0

Et rappelez-vous qu'une fois que vous mettez la sortie de trouver en une seule chaîne en utilisant $(), vous ne pouvez plus différencier les noms de fichiers séparés. Lire http://wooledge.org/mywiki/UsingFind – lhunath

Répondre

2

Supprimez les guillemets superflus:

FILEAGE=7 
FILEDIR='/home/ecom/tmp' 
FILESTRING='search-results-*' 
FILES_FOR_REMOVAL=$(/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;) 
1

Votre syntaxe pour 'trouver' semble correct. Essayez de supprimer les guillemets autour de la chaîne de commande, à savoir

FILES_FOR_REMOVAL=$(/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec ls -lth {} \;) 
1
FILEAGE=7 
FILEDIR='/home/ecom/tmp' 
FILESTRING='search-results-*' 
/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -exec /bin/ls -lth '{}' \; 

Il y avait quelques citations supplémentaires qui ont créé l'erreur. Spécifiez également le chemin complet vers/bin/ls pour éviter les problèmes d'aliasage potentiel de ls (1). Et pour obtenir les noms de fichiers sur une ligne distincte, j'ai supprimé la variable $ FILES_FOR_REMOVAL. Vous pouvez également utiliser

/usr/bin/find "${FILEDIR}" -maxdepth 1 -type f -mtime +${FILEAGE} -name "${FILESTRING}" -ls 
1

(je ne peux pas ajouter des commentaires, mais ...)

Pour gérer de manière fiable les noms de fichiers avec des espaces , vous voudrez peut-être envisager de stocker la liste des fichiers un fichier texte temporaire au lieu d'une variable et une boucle à travers elle à l'aide d'une construction while (au lieu d'un pour)

par exemple:

FILEAGE=7 
FILEDIR='/home/ecom/tmp' 
FILESTRING='search-results-*' 

TEMPFILE=".temp${RANDOM}" 
CMD="find \"${FILEDIR}\" -maxdepth 1 -type f -mtime +${FILEAGE} -name \"${FILESTRING}\" -exec /bin/ls -lth '{}' \;" 

$CMD > $TEMPFILE # write output to file 
while read thefile; do 
    do_somthing_to $thefile 
done < $TEMPFILE 

rm $TEMPFILE # clean up after 

Ou, si vous allez seulement utiliser la liste une fois, redirigez la sortie directement à la construction while:

$CMD | while read thefile; do 
    do_something_to $thefile 
done 
Questions connexes