
Sou novato em estouro de pilha.
Eu preciso de sua ajuda. Obrigado pela sua resposta antecipadamente.
Procurei perguntas semelhantes, mas foi difícil obter uma resposta clara no meu caso.
Eu uso minha sinologia DS1515+ e DSM 6.2.2.
Em primeiro lugar, criei uma pasta diária contendo uma data usando o script abaixo;
mkdir /volume1/video/$(date +%Y-%m-%d\(%a\))
Este script é executado diariamente à meia-noite.
E alguns arquivos de vídeo são baixados. Esses nomes de arquivos contêm data
Por exemplo, ABCDABCD.200328.avi ou EFGHIJKH.200327.1080p.mp4
Os nomes de arquivos não têm regras específicas, mas a data está incluída em todos os nomes de arquivos do tipo AAAMMDD.
Gostaria de copiar esses arquivos para pastas que incluam a mesma data.
(pasta o que é feito automaticamente como explico acima)
Você poderia ajudar ou explicar como fazer isso?
Muito obrigado novamente. Tenha um bom dia.
Responder1
Se bem entendi, você pode tentar isso com GNU grep
an date
:
shopt -s nullglob
for file in *.avi *.mp4; do
dat=$(echo "$file" | grep -Po "(?<=\.)[0-9]{6}(?=\.)")
if [[ $(date "+%y%m%d" -d "$dat") ]]; then
dir=$(date -d "$dat" "+%Y-%m-%d(%a)")
cp "$file" "$dir"
fi
done
Responder2
Uma possibilidade seria usar GNU Awk( gawk
) que possui funções integradas de manipulação de tempo. Por exemplo (supondo que se você tiver gawk
, você também terá implementações GNU de cp
e mv
)
printf '%s\n' *.mp4 *.avi | gawk -F. '
{
datespec = sprintf("20%02d %02d %02d 00 00 00", substr($2,1,2), substr($2,3,2), substr($2,5,2));
cmd = sprintf("echo cp -t %s/ -- %s", strftime("%Y-%m-%d\\(%a\\)",mktime(datespec)), $0);
system(cmd)
}
'
cp -t 2020-03-29(Sun)/ -- EFGHIJKH.200329.1080p.mp4
cp -t 2020-03-28(Sat)/ -- ABCDABCD.200328.avi
Remova o echo
quando estiver satisfeito por estar fazendo a coisa certa. Mude cp
para mv
se quiser mover em vez de copiar.
Outra opção para o caso de movimentação pode ser (ab)usar o rename
utilitário baseado em Perl:
$ rename -n -e 'BEGIN{use Time::Piece}' -e 's@^[^.]*[.]([0-9]{6})[.].*$@Time::Piece->strptime($1,"%y%m%d")->strftime("%Y-%m-%d(%a)/") . $_@e' *.mp4 *.avi
rename(EFGHIJKH.200329.1080p.mp4, 2020-03-29(Sun)/EFGHIJKH.200329.1080p.mp4)
rename(ABCDABCD.200328.avi, 2020-03-28(Sat)/ABCDABCD.200328.avi)
Aqui, remova o -n
após o teste.
Responder3
se você cd
estiver na pasta onde os arquivos de vídeo estão armazenados, poderá mover os arquivos usando o seguinte comando:
mv -v *YYMMDD* /path-to-new-folder
Isso usa uma correspondência de padrão para mover apenas os arquivos que possuem esse formato de data no nome do arquivo. Eu normalmente uso a -v
opção, então o comando é impresso detalhadamente, para que você saiba que ele fez alguma coisa.