GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je utiliser des caractères génériques de style ms-dos avec ls et mv ?

Une des différences fondamentales entre Windows cmd et les shells POSIX sont responsables des extensions génériques. Les shells effectuent toutes les extensions requises avant de lancer les commandes réelles que vous avez demandées. cmd surtout passe les modèles génériques aux commandes sans modification. (Je dis principalement, car je pense qu'il y a des exceptions et que les variables d'environnement sont étendues dans la plupart des cas.) Cela rend l'écriture d'un rename qui fonctionnerait avec la même syntaxe que dans cmd assez délicat.

Mais il y a un rename pour Linux - avec des arguments complètement différents, consultez la page de manuel (qui est un peu concise sur mon système, et rename vient du util-linux package sur mon système, qui devrait être largement disponible). Votre premier changement de nom se ferait comme ceci :

rename .txt .bak *.txt

Notez que le shell fait le * expansion, donc rename lui-même pense en fait qu'il a été invoqué comme ceci :

rename .txt .bak file1.txt file2.txt file3.txt ...

Vous pouvez donc deviner la version de fichier unique :

rename .txt .bak file1.txt

Si vous ne voulez pas utiliser rename mais implémentez-le vous-même, vous pouvez créer une fonction pour cela. En supposant que vous ne vouliez changer que l'extension du fichier, et pour renommer un seul fichier, regardez ceci :

$ function chext() {
  newext="$1"
  file="$2"
  newfile="${file%.*}$newext"
  echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfile est construit en utilisant une suppression de sous-chaîne pour supprimer l'extension d'origine, puis concatène la nouvelle extension. Vous pouvez étendre cette fonction pour gérer plusieurs fichiers relativement facilement.

Quant à votre ls question, utilisez le -d changer. Cela empêchera ls de lister le contenu des répertoires.

Démo :

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Renommer par joker

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Renommer un seul fichier

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Le ls par défaut

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls qui n'inspecte pas les répertoires

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

Une chose à garder à l'esprit en ce qui concerne les caractères génériques est qu'ils sont développés par le shell. L'application ne sait pas si vous avez utilisé des caractères génériques ou tapé les noms. Par exemple, si vous tapez rename *.txt *.bak , puis le rename commande voit quelque chose comme rename file1.txt file2.txt existingfile.bak . Ce n'est pas assez d'informations pour continuer.

Je vais traiter la question sur ls d'abord parce que c'est plus simple. Si tout ce que vous voulez, ce sont les noms correspondants, vous n'avez pas besoin de ls , car le shell effectue déjà l'expansion.

echo t*

Si vous voulez plus d'informations sur les fichiers, passez le -d option à ls , pour lui dire de ne pas lister le contenu des répertoires.

ls -ld t*

Il n'y a pas d'utilitaire standard pour renommer les fichiers, car les premiers systèmes Unix n'en avaient pas. La méthode portable pour renommer les fichiers utilise une boucle et est un peu verbeuse :

for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done

Il existe plusieurs utilitaires courants pour renommer les fichiers, dont aucun n'est garanti pour être installé sur un système Unix donné, mais qui sont tous faciles à installer. Voici les principaux :

  • rename du util-linux suite, disponible sur tous les systèmes Linux non embarqués (et nulle part ailleurs). Sur Debian et dérivés (dont Ubuntu), cette commande s'appelle rename.ul . À condition qu'il n'y ait pas d'occurrence de .txt autre que l'extension finale, vous pouvez écrire

    rename .txt .bak *.txt
    
  • rename est un script Perl fourni par Debian et ses dérivés sous le nom /usr/bin/rename . Vous pouvez renommer des fichiers selon des commandes Perl arbitraires.

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv , qui peut renommer, copier et lier des fichiers selon plusieurs modèles basés sur le nom et dispose de nombreuses options relatives à ce qui se passe si un nom cible existe déjà. Notez que vous devez utiliser des guillemets pour protéger les caractères génériques de l'expansion par le shell.

    mmv '*.txt' '#1.txt'
    
  • zmv est une fonction zsh, disponible si et seulement si votre shell est zsh. Il peut correspondre à des modèles zsh arbitraires (vous pouvez donc faire correspondre des noms de fichiers en fonction d'expressions régulières arbitraires, pas seulement des caractères génériques, et vous pouvez faire correspondre des fichiers selon d'autres critères tels que des dates et des tailles). zmv peut également copier et lier.

    zmv '(*).txt' '$1.txt'
    

Si vous avez un certain contrôle sur les machines que vous utilisez, ma recommandation est d'utiliser zsh comme shell (il a d'autres avantages par rapport à bash) et de mettre ces lignes dans votre ~/.zshrc :

autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'

noglob est une fonctionnalité zsh qui indique au shell de ne pas développer les caractères génériques dans l'argument de la commande. De cette façon, vous pouvez écrire zmv *.txt \$1.txt (vous devrez toujours protéger le $ dans un texte de remplacement).


Linux
  1. Comment utiliser la redirection de sortie en combinaison avec Here-documents et Cat ?

  2. Comment utiliser la commande d'arrêt et de redémarrage de Linux avec des exemples

  3. Comment puis-je utiliser des commandes aliasées avec xargs ?

  4. Comment puis-je trier les ls par propriétaire et groupe ?

  5. Comment utiliser des caractères génériques dans une commande xargs ?

Comment installer et utiliser l'écran Linux, avec des commandes

Comment créer de nouveaux utilisateurs dans OpenShift avec htpasswd et OAuth

Comment installer et utiliser Alpine avec Gmail IMAP sous Linux

Comment installer et utiliser la commande Ack sous Linux avec des exemples

Comment utiliser une clé SSH avec des utilisateurs non root

Android - Comment puis-je utiliser les commandes shell et interagir avec le système Linux en dessous ?