viejos varios script renombrar por para mover mayores extension eliminar directorio dias borrar archivos archivo linux bash rename

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