J'ai de nombreux fichiers avec l'extension .txt. Comment supprimer l'extension .txt pour plusieurs fichiers sous Linux?
Je l'ai trouvé
rename .old .new *.old
substituts .old
extension à .new
Je veux également le faire pour les fichiers dans les sous-dossiers.
rename
est légèrement dangereux, car selon son page de manuel :
renommer renommera les fichiers spécifiés en remplaçant la première occurrence de ...
Il fera heureusement la mauvaise chose avec des noms de fichiers comme c.txt.parser.y
.
Voici une solution utilisant find
et bash
:
find -type f -name '*.txt' | while read f; do mv "$f" "${f%.txt}"; done
Gardez à l'esprit que cela se cassera si un nom de fichier contient une nouvelle ligne (rare, mais pas impossible).
Si vous avez GNU find, c'est une solution plus solide:
find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}"; done
J'utilise ceci:
find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \;
La version Perl de renommer peut supprimer une extension comme suit:
rename 's/\.txt$//' *.txt
Cela pourrait être combiné avec find afin de faire également des sous-dossiers.
Vous pouvez explicitement passer une chaîne vide comme argument.
rename .old '' *.old
Et avec les sous-dossiers, find . -type d -exec rename .old '' {}/*.old \;
. {}
est le substitut de l'entrée trouvée avec find
et \;
termine l'arglist de la commande donnée après -exec
.
Au cas où cela aiderait, voici comment je le fais avec zsh:
for f in ./**/*.old; do
mv "${f}" "${f%.old}"
done
Le ${x%pattern}
la construction dans zsh supprime l'occurrence la plus courte de pattern
à la fin de $x
. Ici, il est résumé en fonction:
function chgext () {
local srcext=".old"
local dstext=""
local dir="."
[[ "$#" -ge 1 ]] && srcext="$1"
[[ "$#" -gt 2 ]] && dstext="$2" dir="$3" || dir="${2:-.}"
local bname=''
for f in "${dir}"/**/*"${srcext}"; do
bname="${f%${srcext}}"
echo "${bname}{${srcext} → ${dstext}}"
mv "${f}" "${bname}${dstext}"
done
}
Usage:
chgext
chgext src
chgext src dir
chgext src dst dir
Where `src` is the extension to find (default: ".old")
`dst` is the extension to replace with (default: "")
`dir` is the directory to act on (default: ".")
Dans Fish, vous pouvez faire
for file in *.old
touch (basename "$file" .old).new
end
Pour les sous-dossiers:
for i in `find myfolder -type d`; do
rename .old .new $i/*.old
done
exécuter dans bash linux
for i in *;do mv ${i} ${i/%.pdf/} ;done