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
duutil-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'appellerename.ul
. À condition qu'il n'y ait pas d'occurrence de.txt
autre que l'extension finale, vous pouvez écrirerename .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).