GNU/Linux >> Tutoriels Linux >  >> Linux

AWK et les noms de fichiers contenant de l'espace.

Le problème ici est l'analyse avec ls . Pensez à jeter un œil ici :Pourquoi vous ne devriez pas analyser la sortie de ls.

La raison pour laquelle vous ne devriez pas le faire est qu'UNIX autorise presque tous les caractères dans un nom de fichier, y compris les espaces, les sauts de ligne, les virgules, les symboles de pipe et à peu près tout ce que vous essaieriez d'utiliser comme délimiteur, à l'exception de NUL. Dans son mode par défaut, si la sortie standard n'est pas un terminal, ls sépare les noms de fichiers par des retours à la ligne. C'est très bien jusqu'à ce que vous ayez un fichier avec une nouvelle ligne dans son nom.


Oh mon dieu, c'est horrible.

Votre script utilise bash ; Je vous suggère plutôt de faire ceci :

#!/bin/bash
for i in *.wav; do mv "${i}" "${i%.wav}.ext"; done

Voir le Guide Bash pour plus de détails sur l'expansion des paramètres.


Vous pourriez essayer ceci.

awk '{print substr($0, index($0,$9))}'

Par exemple, voici la sortie de la commande ls :

-rw-r--r--. 1 root root 73834496 6 décembre 10:55 Fichier avec espaces 2

Si vous utilisez un awk simple comme celui-ci

# awk '{print $9}'

Il renvoie uniquement

# File

Si utilisé avec la commande complète

# awk '{print substr($0, index($0,$9))}'

J'obtiens toute la sortie

Fichier avec espaces 2

Heresubstr(s, a, b) :il renvoie b nombre de caractères de la chaîne s, en commençant à la position a. Le paramètre b est facultatif.

Par exemple, si la correspondance est addr :192.168.1.133 et que vous utilisez substr comme suit

# awk '{print substr($2,6)}'

Vous obtenez l'adresse IP, c'est-à-dire 192.168.1.133. Notez que le 6 est le caractère commençant par a dans l'adresse

Donc, dans la commande appropriée, $2 est $0 (qui imprime toute la ligne.) et index($0,$9) correspond à $9 et imprime tout avant la colonne 9. Vous pouvez changer cela en index($0,$8) et voir que la sortie change à

# 10:55 File with spaces 2

`index(IN, FIND)'Cela recherche dans la chaîne IN la première occurrence de la chaîne FIND et renvoie la position en caractères où cette occurrence commence dans la chaîne IN.

J'espère que cela aide. De plus, si vous affectez cette valeur à une variable dans un script, vous devez placer les variables entre guillemets doubles. Sinon, vous obtiendrez des erreurs si vous effectuez une autre opération pour le nom de fichier extrait.


Linux
  1. Rechercher des fichiers et des répertoires sous Linux avec la commande find

  2. Extraire et afficher des données avec awk

  3. Utilisateurs virtuels et domaines avec Sendmail

  4. Boucler une vidéo avec gstreamer et gst-launch ?

  5. Enregistrer les modifications en place avec awk

Commande Linux Zip et Unzip avec exemples

Expliquer Soft Link et Hard Link sous Linux avec des exemples

Manipuler du texte avec sed et grep

Comment travailler avec File and Shell Provisioner dans Vagrant

Gérer les autorisations de répertoire et de fichier avec chmod Recursive

dd avec obs et seek crée un fichier de taille inattendue