J'écris un script de construction nocturne en bash.
Tout va bien et dandy sauf un petit hic:
#!/bin/bash
for file in "$PATH_TO_SOMEWHERE"; do
if [ -d $file ]
then
# do something directory-ish
else
if [ "$file" == "*.txt" ] # this is the snag
then
# do something txt-ish
fi
fi
done;
Mon problème est de déterminer l'extension du fichier et d'agir en conséquence. Je sais que le problème est dans l'instruction if, testant un fichier txt.
Comment puis-je déterminer si un fichier a un suffixe .txt?
$(dirname $PATH_TO_SOMEWHERE)
et$(basename $PATH_TO_SOMEWHERE)
diviser en dossier et répertoire et faire quelque chose de directory-ish et file-ishRéponses:
Je pense que vous voulez dire "Les quatre derniers caractères de $ file sont-ils égaux à
.txt
?" Si tel est le cas, vous pouvez utiliser les éléments suivants:Notez que l'espace entre
file:
et-4
est obligatoire, car le modificateur «: -» signifie quelque chose de différent.la source
${var:-4}
n'est pas le même que${var: -4}
; le premier (sans espace) se développera comme '-4' si var n'est pas défini le second (avec un espace) retourne les 4 derniers caractères de var.if [ "${file: -4}" == ".txt" ]
place.Faire
comme ça:
Autrement dit, doubles crochets et pas de guillemets.
Le côté droit
==
est un motif de coquille. Si vous avez besoin d'une expression régulière, utilisez=~
then.la source
if
instruction conditionnelle multiple . Je le partage ici au cas où cela aiderait quelqu'un.if [[ ( $file == *.csv ) || ( $file == *.png ) ]]
if [[ $file =~ .*\.(csv|png) ]]
. Il est plus court, plus clair, plus facile d'ajouter des extensions supplémentaires et pourrait être facilement configuré (en mettant "csv | png" dans une variable).if [[ "$file" == *.txt ]]
Si le fichier comporte des espaces dans son nom, des guillemets doubles sont requis.Vous ne pouvez tout simplement pas être sûr sur un système Unix, qu'un fichier .txt est vraiment un fichier texte. Votre meilleur pari est d'utiliser "fichier". Essayez peut-être d'utiliser:
Ensuite, vous pouvez utiliser une liste de types MIME pour comparer ou analyser la première partie du MIME où vous obtenez des éléments tels que "texte", "application", etc.
la source
file -i...
inclut l'encodage mime, vous pouvez utiliserfile --mime-type -b ...
Vous pouvez utiliser la commande "fichier" si vous souhaitez réellement obtenir des informations sur le fichier plutôt que de vous fier aux extensions.
Si vous vous sentez à l'aise avec l'utilisation de l'extension, vous pouvez utiliser grep pour voir si elle correspond.
la source
file
commande. J'avais en fait essayé la correspondance basée sur la sortie de ladite commande ... mais j'échoue horriblement à ces instructions if.Vous pouvez également faire:
la source
case $FILE in *.txt ) ... ;; esac
semblerait plus robuste et idiomatique.Similaire à 'fichier', utilisez le 'mimetype -b' légèrement plus simple qui fonctionnera quelle que soit l'extension du fichier.
Edit: vous devrez peut-être installer libfile-mimeinfo-perl sur votre système si mimetype n'est pas disponible
la source
La bonne réponse sur la façon de prendre l'extension disponible dans un nom de fichier sous Linux est:
Exemple d'impression de toutes les extensions de fichier dans un répertoire
la source
J'ai écrit un script bash qui regarde le type d'un fichier puis le copie dans un emplacement, je l'utilise pour parcourir les vidéos que j'ai regardées en ligne à partir de mon cache Firefox:
Il utilise des idées similaires à celles présentées ici, j'espère que cela sera utile à quelqu'un.
la source
Je suppose que
'$PATH_TO_SOMEWHERE'
c'est quelque chose comme'<directory>/*'
.Dans ce cas, je changerais le code en:
Si vous voulez faire quelque chose de plus compliqué avec les noms de répertoire et de fichier texte, vous pouvez:
Si vous avez des espaces dans vos noms de fichiers, vous pouvez:
la source
for
et leswhile
boucles sont mieux réservées lorsque le corps de la boucle doit être plus complexe.