Obtener el nombre de archivo y la extensión usando Bash
- Obtener el nombre de archivo y la extensión usando Bash
- Ejecución del archivo Bash para obtener el nombre y la extensión del archivo
- Problemas relacionados con los permisos
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 cero0
, lo que significa que no se han proporcionado argumentos; en ese caso, usaríamospwd
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 simplels
, 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
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.