Obtener el nombre de archivo y la extensión usando Bash

Ozair Malik 30 enero 2023
  1. Obtener el nombre de archivo y la extensión usando Bash
  2. Ejecución del archivo Bash para obtener el nombre y la extensión del archivo
  3. Problemas relacionados con los permisos
Obtener el nombre de archivo y la extensión usando Bash

Las secuencias de comandos Bash se están volviendo bastante populares en estos últimos años, ya sea para su tarea diaria de administración de Linux o para una tarea completa de automatización de DevOps.

Suponga que se encuentra en una situación en la que desea extraer un nombre de archivo y su extensión por separado en un script bash. Por ejemplo, hay un archivo Python con el nombre server.py. Queremos dividir esta cadena en dos partes separando el nombre servidor y la extensión py.

Obtener el nombre de archivo y la extensión usando Bash

Hemos escrito un script bash con fines de demostración. Puede usar este código en cualquier lugar de su secuencia de comandos si lo desea.

  • Primero, comprobaremos si el usuario ha proporcionado los argumentos adecuados o no. El siguiente fragmento de código utiliza una declaración if que se vuelve igual a = a cero 0, lo que significa que no se han proporcionado argumentos; en ese caso, usaríamos pwd o nuestro directorio de trabajo actual como argumento predeterminado.
#!/bin/bash

# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
    cDir=$(pwd) # Setting the cDir variable to current directory
    echo "[-] No directory provided!"
else
    cDir=$1

fi
echo "[+] Setting the directory to $cDir"
  • A continuación, comprobamos si el directorio proporcionado por el usuario existe o no. Si no existe, salimos del script.
# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
    echo "[-] Directory $cDir doesn't exist!"
    exit
fi
  • Ahora, comenzamos a extraer los archivos disponibles en el directorio (por supuesto, si es válido) en la variable allFile usando el comando simple ls, que se ejecuta tanto en Linux como en PowerShell en los sistemas operativos Windows.
# Main extraction:
allFile=`ls $cDir`
echo;

Aquí comprobamos si el último valor de la ruta proporcionada no es /, y si no es así, lo añadimos al final para evitar errores.

# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
    cDir+='/'
fi

A continuación, iteramos sobre todo lo presente en la carpeta usando for loop y la variable $allFile. Recuerde de antes que $allFile tiene un valor de ls $cDir.

# Iterating over everything in the folder
for item in $allFile; do
    # Appending path to each file:
    item="$cDir$item"

Comprobamos si el archivo detectado es de tipo archivo mediante la bandera -f en el bucle. Si ese es el caso, eliminamos la parte del punto del nombre del archivo, por ejemplo, la parte de la extensión.

Al final, imprimimos los resultados de la forma deseada utilizando echo.

# Checking if current item is a file:
if [[ -f $item ]]; then
	ext=`ls $item | rev | cut -d '.' -f 1 | rev`
	file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
	echo "File Name: $file_name -> Extension: $ext"
fi
  • Este script comprueba si existe un directorio específico o no. Y si el directorio existe, mencionará todos los archivos junto con su extensión.
┌─[root@parrot][/home/user/Downloads]
└──╼ #./test2.sh
[-] No directory provided!
[+] Setting the directory to /home/user/Downloads

File Name: /home/user/Downloads/ExtraCredit_Sockets_Intro -> Extension: pdf
File Name: /home/user/Downloads/project -> Extension: sh
File Name: /home/user/Downloads/test2 -> Extension: sh
File Name: /home/user/Downloads/test -> Extension: txt
Nota
Ejecutamos el script sin ningún directorio proporcionado como argumento, por lo que considera Descargas, es decir, mi directorio actual, como predeterminado y menciona todos los nombres de archivo y sus extensiones presentes en ese directorio.

Cada línea del código está comentada, por lo que puede verificarlo si tiene alguna confusión.

Si desea utilizar el script, aquí está su versión completa.

#!/bin/bash

# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
	cDir=$(pwd) # Setting the cDir variable to current directory
	echo "[-] No directory provided!"
else
	cDir=$1
fi
echo "[+] Setting the directory to $cDir"

# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
	echo "[-] Directory $cDir doesn't exist!"
	exit
fi

# Main extraction:
allFile=`ls $cDir`
echo;

# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
	cDir+='/'
fi

# Iterating over everything in the folder
for item in $allFile; do
	# Appending path to each file:
	item="$cDir$item"
	# Checking if current item is a file:
	if [[ -f $item ]]; then
		ext=`ls $item | rev | cut -d '.' -f 1 | rev`
		file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
		echo "File Name: $file_name -> Extension: $ext"
	fi
done

Ejecución del archivo Bash para obtener el nombre y la extensión del archivo

En caso de que sea un novato y esté intentando aprender bash y no sepa cómo ejecutarlo, utilice este código; todo lo que tienes que hacer es crear un archivo con la extensión .sh, lo que significa que es un archivo bash.

Después de eso, navegue a ese directorio usando la terminal de su elección y escriba ./filename, que debería ejecutar el archivo.

Si tiene un sistema operativo Windows, escriba bash file.sh y debería ejecutarse sin problemas.

Recuerde utilizar el nombre de archivo correcto del script en su caso.

Problemas relacionados con los permisos

Nota: Podría enfrentarse a un error de Permiso denegado mientras ejecuta el script.

Debe proporcionar los permisos correctos utilizando chmod + x [nombre de archivo] en la terminal.

Ejecute PowerShell o el símbolo del sistema como administrador si está en Windows para evitar cualquier problema relacionado con los permisos.

Artículo relacionado - Bash File