bash - renombrar - Cómo eliminar el prefijo de nombre de archivo con un shell de Posix
renombrar archivo linux (5)
¿Cómo puedo eliminar el prefijo del nombre de archivo en Bash como en el siguiente ejemplo?
XY TD-11212239.pdf
Llegar
11212239.pdf
es decir, eliminar XY TD-
?
Además de la extracción de subcadenas que se muestra en otras respuestas, también puede utilizar el reemplazo de subcadena. Dado el archivo:
fn="XY TD-11212239.pdf"
Luego reemplazo de subcadena de:
fn_new=${fn//*TD-/}
Hará también lo que quieras.
Dijiste shells POSIX que incluirían BASH, Kornshell, Ash, Zsh y Dash. Afortunadamente, todos estos shells filtran patrones en valores variables.
Los patrones son los que usa cuando especifica archivos con cosas como *
en la línea de comandos de Unix / Linux:
$ ls *.sh # Lists all files with a `.sh` suffix
Estas shells POSIX usan cuatro filtros de patrón diferentes:
-
${var#pattern}
- Elimina la cadena más pequeña del lado izquierdo que coincide con el patrón. -
${var##pattern}
- Elimina la cadena más grande del lado izquierdo que coincide con el patrón. -
${var%pattern}
- Elimina la cadena más pequeña del lado derecho que coincide con el patrón. -
${var%%pattern}
- Elimina la cadena más grande del lado derecho que coincide con el patrón.
Aquí están algunos ejemplos:
foo="foo-bar-foobar"
echo ${foo#*-} # echoes ''bar-foobar'' (Removes ''foo-'' because that matches ''*-'')
echo ${foo##*-} # echoes ''foobar'' (Removes ''foo-bar-'')
echo ${foo%-*} # echoes ''foo-bar''
echo ${foo%%-*} # echoes ''foo''
Realmente no explicaste lo que quieres, y no incluiste ningún ejemplo de código, por lo que es difícil encontrar algo que haga lo que quieras. Sin embargo, al usar el filtrado de patrones, probablemente pueda averiguar exactamente qué quiere hacer con sus nombres de archivo.
file_name="XY TD-11212239.pdf"
mv "$file_name" "${file_name#*-}" # Removes everything from up to the first dash
También puede usar la herramienta de cambio de nombre
Instalarlo con homebrew
brew install rename
A continuación, ejecute el siguiente comando desde dentro del directorio para eliminar el "prefijo-" de todos los archivos
rename -d prefix- *
$ s=''XY TD-11212239.pdf''
$ echo "${s#XY TD-}"
11212239.pdf
Si su objetivo es realizar un cambio de nombre masivo:
while IFS= read -r -d '''' filename; do
mv "$filename" "${filename#XY TD-}"
done < <(find . -type f -name ''XY TD-*'' -print0)
Tenga en cuenta que <()
es una extensión bash no presente en POSIX sh. Puede reemplazarlo con una tubería de la forma find ... | while
find ... | while
Del mismo modo, -print0
es una extensión de GNU no presente en POSIX find. POSIX find no ofrece una forma equivalente de localizar archivos que sean seguros para nombres que contengan líneas nuevas, lo que dificulta su reemplazo.
Usted ha dado muy poca información, pero suponiendo que está haciendo esto en bash, y tiene una lista de archivos cuyo prefijo debe eliminarse, puede canalizar la lista a través de sed
:
Por ejemplo:
./generate_your_list_of_files | sed -e ''s/^prefix//''
o si su lista de archivos está separada por espacios:
echo TD-file1 TD-file2.x.yt TD-file3-beep | sed -e ''s//<TD-//g''
El primero coincide con el prefijo al principio de la línea y lo elimina. El segundo coincide con TD-
(o cualquier otro prefijo que desee sustituir) solo cuando sucede al comienzo de una palabra y lo reemplaza en todas las coincidencias en todas las líneas. Sin embargo, esto podría ser peligroso, por ejemplo, un archivo como TD-file/ that/ TD-contains/ space.txt
convierte en el file/ that/ contains/ space.txt
Como nota al margen, no obtenga su lista de archivos usando ls
. Ese es un horrible error . Si necesita obtener una lista de archivos para trabajar y referirse a ellos en más de un lugar, sugiero ponerlos en una matriz:
files=(*)
y luego trabaja con esta matriz.
Debido a las solicitudes populares (el único comentario a continuación), aquí se muestra cómo cambiar el nombre de todos los archivos en el directorio que comienzan con XY TD-
modo que se elimine el prefijo (gracias a @tripleee):
for file in prefix*;
do
mv "$file" "${file#XY TD-}"
done