Bash: crear nombres de archivos según los nombres de los directorios

Bash: crear nombres de archivos según los nombres de los directorios

Digamos que tengo una estructura de directorios que es comoParent_dir/<name>/<date>/

¿Cómo puedo usar un script bash colocado Parent_dirpara navegar a través de cada /<name>/<date>/subdirectorio y crear un archivo de texto en blanco nombrado <name>_<date>.txtdentro /<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 touchcambiará la marca de tiempo de cualquier archivo existente.

Puedes hacer un ensayo primero reemplazando touchcon 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 profundidad

  • f=${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

información relacionada