script - Linux: eliminar extensiones de archivos para varios archivos
renombrar archivo linux (7)
En Fish, puedes hacer
for file in *.old
touch (basename "$file" .old).new
end
Tengo muchos archivos con extensión .txt. ¿Cómo eliminar la extensión .txt para múltiples archivos en Linux?
encontre eso
rename .old .new *.old
sustituye la extensión .old
a .new
También quiero hacer esto para archivos en subcarpetas.
En caso de que ayude, así es como lo hago con zsh:
for f in ./**/*.old; do
mv "${f}" "${f%.old}"
done
El constructo ${x%pattern}
en zsh elimina la ocurrencia más corta de pattern
al final de $x
. Aquí se abstrae como una función:
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
}
Uso:
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: ".")
La versión de cambio de nombre de Perl puede eliminar una extensión de la siguiente manera:
rename ''s//.txt$//'' *.txt
Esto podría combinarse con find para también hacer subcarpetas.
Para subcarpetas:
for i in `find myfolder -type d`; do
rename .old .new $i/*.old
done
Puede pasar explícitamente una cadena vacía como argumento.
rename .old '''' *.old
Y con subcarpetas, find . -type d -exec rename .old '''' {}/*.old /;
find . -type d -exec rename .old '''' {}/*.old /;
. {}
es el sustituto de la entrada encontrada con find
, y /;
termina el arglist para el comando dado después de -exec
.
Yo uso esto:
find ./ -name "*.old" -exec sh -c ''mv $0 `basename "$0" .old`.new'' ''{}'' /;
rename
es ligeramente peligroso, ya que de acuerdo con su página de manual:
rename cambiará el nombre de los archivos especificados reemplazando la primera aparición de ...
Felizmente hará lo incorrecto con nombres de archivo como c.txt.parser.y
.
Aquí hay una solución que usa find
y bash
:
find -type f -name ''*.txt'' | while read f; do mv "$f" "${f%.txt}"; done
Tenga en cuenta que esto se romperá si un nombre de archivo contiene una línea nueva (raro, pero no imposible).
Si tiene GNU find, esta es una solución más sólida:
find -type f -name ''*.txt'' -print0 | while read -d $''/0'' f; do mv "$f" "${f%.txt}"; done