Comment identifier le type de fichier pour un grand nombre de fichiers et attacher une extension appropriée à chacun

2

J'ai un peu plus de mille (1000) fichiers dont le suffixe / extension a été modifié par un moteur de base de données et qui ont tous la même chose (par exemple, nomFichier.abcd où .abcd figure sur chaque fichier, qu'il s'agisse d'un fichier jpg, pdf ou n'importe quoi d'autre).

L'objectif est de convertir tous les fichiers au format PDF, mais je veux d'abord trier les différents types de fichiers dans des dossiers distincts.

J'utilise Mac OS X et pense qu'il doit y avoir un script Terminal qui:

  1. Identifiez le fichier (peut-être avec la commande 'Fichier'?) Puis ...
  2. Ajouter l'extension appropriée qui serait alors ...
  3. Permettez-moi de les trier manuellement et de les placer dans des dossiers distincts pour un traitement ultérieur, en fonction du type de fichier.

En utilisant la commande 'Fichier' du terminal sur un fichier avec le suffixe de la base de données, les résultats typiques sont assez verbeux, ce qui montre au moins que le Mac peut identifier les types de fichiers même s'ils ont le suffixe «incorrect»:

  • Données d'image JPEG, norme JFIF 1.01
  • Document PDF, version 1.3
  • Données au format RTF, version 1, ANSI
  • etc.

Je n'ai donc besoin que d'un script permettant de baliser les fichiers afin de pouvoir utiliser Automator pour renommer les fichiers ultérieurement avec le suffixe approprié.

Je remarque que si dans le terminal, je tape 'Fichier' et que j'y dépose ou copie plusieurs fichiers, puis que je retourne dessus, le terminal les identifie correctement dans le même ordre, mais cela ne sert à rien, à moins qu'il ne soit étiqueté chaque type de fichier différemment.

Je pense que cette tâche initiale est trop difficile pour Automator, mais j'aimerais avoir tort.

Toute aide pour ce faire serait appréciée. J'ai vérifié ce forum et ailleurs en espérant que quelqu'un d'autre aurait eu un problème similaire, mais je n'ai trouvé aucun problème de ce type dans la liste.

Steve K
la source

Réponses:

1

Ceci est assez facile en combinant certains outils standard:

  • file pour rechercher le type mime
  • tr pour supprimer les barres obliques (sinon, vous auriez des dossiers imbriqués pour différents groupes de fichiers)
  • bien, certaines évidentes mkdiret mvcommandes
for file in *
do
    mime=$(file --brief --mime-type "$file" | tr '/' '_')
    mkdir -p "$mime"
    mv "$file" "$mime/$file"
done

Vous pouvez également également répertorier directement les extensions de fichier pour chaque type de mime attendu et les renommer automatiquement de manière appropriée.

for file in *
do
    mime=$(file --brief --mime-type "$file")

    case "$mime" in
    "image/jpeg")
        extension="jpeg"
        ;;
    "text/plain")
        extension="txt"
        ;;
    "application/pdf")
        extension="pdf"
        ;;
    *)
        continue;
        ;;
    esac

    filename="${file%.*}"

    mv "$file" "$filename.$extension"
done

Sachez que par souci de lisibilité, je ne me suis pas occupé des noms de fichiers contenant des espaces. Si vous les avez, vous devrez appliquer l' un des modèles pour traiter les espaces dans les noms de fichiers . Comme il semble que vous ne les ayez pas, je les ai omis, car ils rendent les scripts beaucoup plus compliqués qu'ils ne le sont.

Jens Erat
la source
1
J'aime la prémisse derrière vos scripts, mais avec le premier s'il y a des répertoires dans le répertoire dans lesquels le script est exécuté, ils sont également déplacés application_x-directoryet ce n'est pas une bonne OMI. Il devrait être codé pour ne pas traiter les répertoires. Vous notez également "Sachez que par souci de lisibilité, je ne me suis pas occupé des noms de fichiers contenant des espaces". Cependant, je trouve que les deux fonctionnent correctement sur les noms de fichiers avec des espaces.
user3439894
Si vous appliquez le modèle des fichiers contenant des espaces dans le lien que j'ai fourni, l' ajout d' un filtre -type fà findest tout ce que vous devez faire pour exclure les répertoires.
Jens Erat
Je pense que vous manquez le point, dans le premier script, vous avez posté du code qui est intrinsèquement cassé selon le PO pour agir sur des fichiers avec des extensions non valides et non des répertoires et fournir un script cassé tout en fournissant un lien pour le réparer est un peu ridicule. Si vous aviez simplement ajouté, par ma suggestion, quelque chose du genre if [[ ! -d "$file" ]]; then ..., je l'aurais voté contre.
user3439894
Merci Jens. Cette réponse était encore meilleure que ce à quoi je m'attendais. Je devrais vraiment apprendre ce genre de choses sur le terminal. Cela semble beaucoup plus efficace que n'importe quelle interface graphique.
Steve K
@ user3439894 est correct: il n'y a absolument rien à faire pour que cela fonctionne avec des noms de fichiers contenant des espaces - échapper à toutes les utilisations de $file, comme le font les exemples de scripts, suffit (voir BashFAQ pour savoir pourquoi.). Le paragraphe et le lien pertinents doivent être supprimés, car ils sont à la fois non pertinents et préjudiciables à la réponse.
Kopischke