Copie um arquivo contendo uma data no nome do arquivo para uma pasta dessa data

Copie um arquivo contendo uma data no nome do arquivo para uma pasta dessa data

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 grepan 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 cpe 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 echoquando estiver satisfeito por estar fazendo a coisa certa. Mude cppara mvse quiser mover em vez de copiar.

Outra opção para o caso de movimentação pode ser (ab)usar o renameutilitá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 -napós o teste.

Responder3

se você cdestiver 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 -vopção, então o comando é impresso detalhadamente, para que você saiba que ele fez alguma coisa.

informação relacionada