![Bash: crear nombres de archivos según los nombres de los directorios](https://rvso.com/image/109239/Bash%3A%20crear%20nombres%20de%20archivos%20seg%C3%BAn%20los%20nombres%20de%20los%20directorios.png)
Digamos que tengo una estructura de directorios que es comoParent_dir/<name>/<date>/
¿Cómo puedo usar un script bash colocado Parent_dir
para navegar a través de cada /<name>/<date>/
subdirectorio y crear un archivo de texto en blanco nombrado <name>_<date>.txt
dentro /<name>/<date>/
del subdirectorio?
Respuesta1
Desde el Parent_dir
:
for d in */*/; do f=${d/\//_}; touch -- "$d"/"${f::-1}.txt"; done
Tenga en cuenta que esto touch
cambiará la marca de tiempo de cualquier archivo existente.
Puedes hacer un ensayo primero reemplazando touch
con echo
:
for d in */*/; do f=${d/\//_}; echo -- "$d"/"${f::-1}.txt"; done
for d in */*/
nos permite iterar sobre los directorios de dos niveles de profundidadf=${d/\//_}
reemplaza el primer separador de directorio/
y_
guarda la salida como variablef
"$d"/"${f::-1}.txt"
se expande al nombre del directorio, seguido del nombre del archivo deseado;${f::-1}
quita el último/
de la variablef
Tenga en cuenta que, como el separador de directorio /
está presente con la variable d
, el /
in "$d"/"${f::-1}.txt"
es redundante; Como casi todos los sistemas lo toman //
como único /
, esto no debería ser un problema. Alternativamente, puedes gotear /
:
for d in */*/; do f=${d/\//_}; touch -- "${d}${f::-1}.txt"; done
Respuesta2
Si desea que los nombres de los archivos se nombren literalmente name_date.txt
, intente esto:
#!/bin/bash
for dir in $(find . -maxdepth 2 -mindepth 2 -type d)
do
touch "$dir"/name_date.txt
done
Si desea que los nombres de los archivos sean <name>_<date>.txt
, haga esto en su lugar:
#!/bin/bash
IFS=$'\n'
for dir in $(find . -maxdepth 1 ! -path . -type d)
do
for subdir in $(find "$dir" -mindepth 1 -type d)
do
base_dir=$(basename $dir)
base_subdir=$(basename $subdir)
touch "$base_dir"/"$base_subdir"/"$base_dir"_"$base_subdir".txt
done
done
Respuesta3
find . -type d -exec sh -c '
case ${1//[!\/]/} in
"//" ) f=${1:2}; f=${f/\//_}; :> "$1/$f.txt" ;;
* ) false ;;
esac
' {} {} \; -prune
for d in */*/; do
f=${d/\//_}
:> "${d%?}/${f%?}.txt"
done