Forum Linux.général Petites questions sur Bash et la commande ls

Posté par  (site web personnel) .
Étiquettes : aucune
0
14
juil.
2004
Hello, j'ai deux petites questions sur la ligne de commande que voici :

1) il m'arrive souvent de copier/renommer/déplacer des fichiers/dossiers dans des répertoire dans lesquels je ne suis pas (comme tout le monde je pense).

Exemple : je suis sur home et j'aimerai renommer le fichier truc.txt se trouvant dans bazar/essai/probleme/01/ en truc2.txt, je dois donc taper
mv bazar/essai/probleme/01/truc.txt bazar/essai/probleme/01/truc2.txt

Le problème, c'est que c'est long de devoir taper deux fois le meme path, est-ce qu'il existe pas une astuce/raccourci pour éviter ça ?

2) en utilisant la commande ls -la, les fichiers et les dossiers sont classés dans l'ordre alphabétique, j'aimerai savoir quelles options utiliser pour afficher les dossiers dans l'ordre alphabétique puis après seulement les fichiers ou l'inverse (en gros que les dossiers ne soient pas mélangés avec les fichiers). j'ai essayé de décrypter le man de ls mais j'ai pas trouvé.

Merci bcp !
  • # pour 1)

    Posté par  . Évalué à 2.

    Une solution est de se rajouter dans son environnement (genre ~/.bashrc) une fonction qui fait ce que tu veux :
    renomme() {
       mv "$1"  "$(dirname $1)/$2"
    }
    
    (je l'appelle renomme, parceque "ren" ou "rename" sont déjà peut-être pris sur ta machine par des trucs qui peuvent t'interresser aussi d'ailleurs. Jette y un oeil.)
  • # pour 2)

    Posté par  . Évalué à 2.

    Tu as l'option "-X" qui groupe par extension. Si tout tes fichiers en ont, et pas tes répértoire (à la windows quoi), ça peut peut-être te suffire. Sinon, je vois pas non plus d'option qui va bien. Le plus simple est probablement d'écrire un truc à ta sauce, de ce style là (en y rajoutant ce que tu veux comme options à ls biensûr) :
    myls() {
       local f p
       if [ -n "$1" ] ; then 
          p="$1"
       else
          p="./"
       fi
       for f in $(find "$p" -mindepth 1 -maxdepth 1 -type d | sed "s:^${p}::" | sort) ; do 
          ls -d "$f"
       done
       for f in $(find "$p" -mindepth 1 -maxdepth 1 -not -type d | sed "s:^${p}::" | sort) ; do 
          ls "$f"
       done
    }
    
    Bon ouais c'est pas génial comme solution ça. Un truc peut être mieux serait d'utiliser l'indicateur de filetype que donne ls (option -p) pour afficher le résultat en deux fois. Un truc dans ce genre là :
    myls2() {
       local p
       if [ -n "$1" ] ; then 
          p="$1"
       else
          p="./"
       fi
       ls -lp --color "$p" | sed -n '/\/$/p'
       ls -lp --color "$p" | sed '/\/$/d'
    }
    
    PS: j'ai rien testé, t'as le droit de te plaindre si ça déconne, je corrigerai dans ces cas là.
    • [^] # Re: pour 2)

      Posté par  (site web personnel) . Évalué à 1.

      merci pour les deux scripts je les essayerai ce soir.
      par contre c dommage qu'il n'aient pas pensé à ça les auteurs de cette commande et que l'on soit obligé de scripter :).
      • [^] # Re: pour 2)

        Posté par  (site web personnel) . Évalué à 2.

        C'est aussi pour ça que le code source est disponible hein.

        pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

    • [^] # Re: pour 2)

      Posté par  . Évalué à 1.

      plus simple: ls -l | sort

      Le premier caractere du premier champ donne le type de fichier (lien, repertoire, ...).
      • [^] # Re: pour 2)

        Posté par  . Évalué à 2.

        Après relecture de la demande initiale il me semblerait que ceci devrait fonctionner:
        ls -l | sort +0.0 -0.1 +8 -9
        J'ai testé sous AIX dans un répertoire (/etc). Aparamment ça fonctionne.

        Il faudra peut-être ajuster les champs à prendre en compte par sort (selon le format retourné par ls sous linux).
        • [^] # Re: pour 2)

          Posté par  . Évalué à 2.

          J'étais jamais rentré dans les détails de 'man sort', et la séléction des champs m'avait donc échappé. Je te remercie _beaucoup_ pour cette info (et avec moult retard si bien que tu ne le sauras probablement jamais...), ça peut être vraiment pratique.
          • [^] # Re: pour 2)

            Posté par  . Évalué à 1.

            Si, je le sais (j'ai répondu tard à ton message). Je suis allé voir "UNIX Utilisation, Administration,Reseau Internet" de Christian Pélissier. Un peu ancien, mais donne d'excellentes informations sur les commandes Unix les plus courantes.
          • [^] # Re: pour 2)

            Posté par  . Évalué à 1.

            Euh ... Pas très clair ce que j'ai posté avant ...
            Je treprends:
            avec moult retard si bien que tu ne le sauras probablement jamais

            Si je sais. J'ai Répondu tardivement à ton post initial (posté le 14, ma réponse a été envoyée le 15 au soir,après que d'autres réponses aient été données). Je consulte les messages un peu "ancien" de temps en temps histoire de voir les réactions à mes posts ...
            J'étais jamais rentré dans les détails de 'man sort', et la séléction des champs m'avait donc échappé.

            Je n'étais jamais almlé dans les détails également ... jusqu'au jour où j'en ai eu vraiment besoin ... Cependant il y a un bouquin (un peu ancien, certes, mais encore très utile) qui m'a aidé (et que j'ai consulté pou te répondre), c'est "UNIX Utilisation, Administration, Reseau Internet" de Christian Pelissier. Un classique bien pratique pour comprendre les commandes Unix de base.
  • # commande ls

    Posté par  . Évalué à 3.

    - ce n'est pas si fatigant de devoir taper les chemins complet : si tu te sert de la tabulation, bash fera de l'auto completion

    - "cd -" te fait revenir a ton precedent repertoire .
    tu est dans /tmp par exemple :

    % pwd
    /tmp
    % cd bazar/essai/probleme/01/
    % pwd
    /tmp/bazar/essai/probleme/01/
    % mv truc1.txt truc2.txt
    % cd -
    % pwd
    /tmp

    - si tu as plusieurs manips a faire, tu peut te servir de pushd popd qui stockent er destocken le repertoire courant dans DIRSTACK. exemple :

    % pwd
    /tmp
    % pushd bazar/essai/probleme/01/
    % pwd
    /tmp/bazar/essai/probleme/01/
    % cd xxx
    % cd yyy
    (...)
    % popd
    % pwd
    /tmp

    tu peux empiler autant de pushd que tu veux
    cf le man de bash parties : pushd popd dirs etc
    • [^] # Re: commande ls

      Posté par  (site web personnel) . Évalué à 1.

      ok merci j'essayerai les commandes pushd et popd que je ne connaissais pas.
      c tjrs intéressant de découvrir de nouvelles commandes bash :).
  • # Commentaire supprimé

    Posté par  . Évalué à 10.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: arf !

      Posté par  (site web personnel) . Évalué à 1.

      Alors là chapeau l'astuce !

      merci, j'aurai jamais trouvé un truc pareil...
    • [^] # Re: arf !

      Posté par  (site web personnel) . Évalué à 2.

      Tu devrais poster ca en astuce, cette commande est pratique, je connaissai l'emploi des accolades, mais je n'avais jamais pensé a l'utiliser dans le ca d'un mv.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.