![Bash: criando nomes de arquivos de acordo com nomes de diretórios](https://rvso.com/image/109239/Bash%3A%20criando%20nomes%20de%20arquivos%20de%20acordo%20com%20nomes%20de%20diret%C3%B3rios.png)
Digamos que eu tenha uma estrutura de diretórios parecida comParent_dir/<name>/<date>/
Como posso usar um script bash colocado Parent_dir
para navegar por cada /<name>/<date>/
subdiretório e criar um arquivo de texto em branco nomeado <name>_<date>.txt
dentro /<name>/<date>/
do subdiretório?
Responder1
De Parent_dir
:
for d in */*/; do f=${d/\//_}; touch -- "$d"/"${f::-1}.txt"; done
Observe que isso touch
alterará o carimbo de data/hora de qualquer arquivo existente.
Você pode fazer um teste primeiro substituindo touch
por echo
:
for d in */*/; do f=${d/\//_}; echo -- "$d"/"${f::-1}.txt"; done
for d in */*/
nos permite iterar nos diretórios com dois níveis de profundidadef=${d/\//_}
substitui o primeiro separador de diretório/
e_
salva a saída como variávelf
"$d"/"${f::-1}.txt"
expande para o nome do diretório, seguido pelo nome do arquivo desejado;${f::-1}
retira o último/
da variávelf
Observe que, como o separador de diretório /
está presente com a variável d
, o /
in "$d"/"${f::-1}.txt"
é redundante; como quase todos os sistemas aceitam //
single /
, isso não deve ser um problema. Alternativamente, você pode pingar /
:
for d in */*/; do f=${d/\//_}; touch -- "${d}${f::-1}.txt"; done
Responder2
Se você quiser que os nomes dos arquivos sejam literalmente nomeados 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 o seguinte:
#!/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
Responder3
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