Sua pergunta não está totalmente clara para mim, mas acho que posso entender o que você está tentando fazer.
Aqui está o loop que você está usando:
for x in /home/tb/temp/*.pdf
do
d="${x:4:4}-${x:8:2}-${x:10:2}"
mkdir -p "$d"
mv -- "$x" "$d/"
done
Os nomes de arquivos de exemplo que você deu foram:
-
Dispatch Fax_20180521121901.pdf
-
Dispatch_20180521124202.pdf
Um problema para mim é que sua expressão de substituição de parâmetro ( d="${x:4:4}-${x:8:2}-${x:10:2}"
) não parece produzir os resultados corretos, por exemplo:
> x='Dispatch Fax_20180521121901.pdf'
> d="${x:4:4}-${x:8:2}-${x:10:2}"
> echo ${d}
atch- F-ax
> x='Dispatch_20180521124202.pdf'
> d="${x:4:4}-${x:8:2}-${x:10:2}"
> echo ${d}
atch-_2-01
Você pode tentar usar grep
, por exemplo:
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | grep -Po '\d{8}')
> echo ${d}
20180521
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | grep -Po '\d{8}')
> echo ${d}
20180521
Ou, se você quiser adicionar hífens, poderá usar a seguinte substituição de comando sed
-based:
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | sed -E 's/^[^0-9]*([0-9]{4})([0-9]{2})([0-9]{2}).*$/--/')
> echo ${d}
2018-05-21
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | sed -E 's/^[^0-9]*([0-9]{4})([0-9]{2})([0-9]{2}).*$/--/')
> echo ${d}
2018-05-21
Supondo que esse é o resultado desejado (ou seja, se você deseja subdiretórios do formato %Y-%m-%d
), poderíamos substituir sua expressão de substituição de parâmetro pela substituição de comando grep
-based. Isso nos daria o seguinte loop modificado:
for filename in /home/tb/temp/*.pdf; do
datestring=$(echo "${filename}" | sed -E 's/^[^0-9]*([0-9]{4})([0-9]{2})([0-9]{2}).*$/--/')
mkdir -p "${datestring}"
mv -i -- "${filename}" "${datestring}/"
done
Isso deve produzir subdiretórios da forma %Y-%m-%d
e preenchê-los com os arquivos apropriados.
UPDATE: Com base no seu comentário, parece que o que você deseja são subdiretórios aninhados no formulário %Y/%m/%d
. Para isso, você precisaria extrair as substrings de ano, mês e dia separadamente, por exemplo:
> x='Dispatch Fax_20180521121901.pdf'
> d=$(echo "${x}" | grep -Po '\d{8}')
> year=${d:0:4}
> month=${d:4:2}
> day=${d:6:2}
> echo "${year}/${month}/${day}/"
2018/05/21/
Isso nos leva ao seguinte loop:
for filename in /home/tb/temp/*.pdf; do
datestring=$(echo "${filename}" | grep -Po '\d{8}')
year=${datestring:0:4}
month=${datestring:4:2}
day=${datestring:6:2}
directory="${year}/${month}/${day}/"
mkdir -p "${directory}"
mv -i -- "${filename}" "${directory}"
done