Bash: criando nomes de arquivos de acordo com os nomes dos diretórios

0

Digamos que eu tenha uma estrutura de diretórios que seja como Parent_dir/<name>/<date>/

Como posso usar um script bash colocado em Parent_dir para navegar por todos os subdiretórios /<name>/<date>/ e criar um arquivo de texto em branco chamado <name>_<date>.txt dentro do subdiretório /<name>/<date>/ ?

    
por Austin 09.04.2017 / 04:47

3 respostas

1

Se você quiser que os nomes dos arquivos sejam literalmente denominados name_date.txt , tente isto:

#!/bin/bash
for dir in $(find . -maxdepth 2 -mindepth 2 -type d)
do
    touch "$dir"/name_date.txt
done

Se você quiser que os nomes dos arquivos sejam <name>_<date>.txt , faça isso:

#!/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
    
por 09.04.2017 / 05:25
2

Do Parent_dir :

for d in */*/; do f=${d/\//_}; touch -- "$d"/"${f::-1}.txt"; done

Observe que touch alterará o registro de data e hora de qualquer arquivo existente.

Você pode fazer uma execução a seco primeiro substituindo touch por echo :

for d in */*/; do f=${d/\//_}; echo -- "$d"/"${f::-1}.txt"; done
  • for d in */*/ nos permite iterar pelos diretórios dois níveis de profundidade

  • f=${d/\//_} substitui o primeiro separador de diretório / por _ e salva a saída como variável f

  • "$d"/"${f::-1}.txt" expande para o nome do diretório, seguido pelo nome de arquivo desejado; ${f::-1} retira o último / da variável f

Observe que, como o separador de diretório / está presente com a variável d , o / em "$d"/"${f::-1}.txt" é redundante; como quase todos os sistemas aceitam // como único / , isso não deve ser um problema. Como alternativa, você pode pingar / :

for d in */*/; do f=${d/\//_}; touch -- "${d}${f::-1}.txt"; done
    
por 09.04.2017 / 05:37
1
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
    
por 09.04.2017 / 10:54