Je voulais supprimer toutes les extensions .sh, j'ai fait ceci:
ls *.sh | xargs -I {} mv {} `basename {} .sh`
Cependant, cela ne fonctionne pas, il se comporte comme basename
un nom de fichier sans changement.
Pourquoi se comporte-t-il ainsi?
Par exemple, cela fonctionne:
ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;
MODIFIER :
Solution: un guillemet simple empêche l' `basename ...`
évaluation par le shell avant l'exécution de la commande.
ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`'
bash
text-processing
xargs
majkinetor
la source
la source
-i
option, mais ces options «classiques» ont été dépréciées. Par exemple, pour utiliser une seule option / ligne, la nouvelle page de manuel POSIX recommande-L1
. Pour appeler l'ancien comportement de-i
, la page recommande l'-I'{}'
option.rename
, par exemple:rename 's/\.sh//' *.sh
. Essayez d'abord avec un essai à sec (-n
).rename
fonctionne très bien et assez simple, mais n'oubliez pas que c'est très spécifique à la distribution. Les distributions basées sur RHEL et Debian fournissent desrename
commandes différentes , il faut donc garder cela à l'esprit lors de la création de scripts de distribution croisée.Je ne suis pas sûr de votre question, demandez-vous pourquoi votre première ligne ne fonctionne pas? Ou recherchez-vous une méthode appropriée pour renommer tous les fichiers .sh?
En supposant que c'est la méthode la plus propre, je préfère préparer les options de commande avant
xargs
. Pour supprimer une extension de fichier .sh, je considère souvent cette approche,la source