Suponho que, para o arquivo 07-10-2012-11-50-14-656.doc.gz
, você deseja classificá-lo por ano (ou seja, 2012
) e mês (ou seja, 10
).
#!/usr/bin/env bash
# This is the preferred way of invoking a bash script, and is better than #!/bin/bash for reasons of portability.
# To use the script, make it executable with 'chmod u+x /path/to/script'
# Then run this script with '/path/to/script /path/to/original/files /path/to/docs_by_date'
# Let's set up some path variables. This script will transfer files from the directory specified by the first argument to the directory specified by the second.
pathtooriginalfiles=
pathtotarget=
# Lets iterate over the files in the original directory, by listing all non-invisible files with $(ls ${pathtooriginalfiles}), and repeating the block with $i changing each time.
for i in $(ls "${pathtooriginalfiles}"); do
# Find the matching parts of the filename that specify the date by echoing then piping the variable to sed. The regex part looks for "everything at the beginning" ^.*, followed by two iterations of digits [0-9]{2}, followed by four iterations of digits, etc. before ending with .doc.gz. It then replaces this entire string with what matches between () using the variable, i.e. the year or month.
year=$(echo -n ${i}| sed -r 's/^.*[0-9]{2}-([0-9]{4})-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{3}\.doc\.gz$//')
month=$(echo -n ${i}| sed -r 's/^.*([0-9]{2})-[0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{3}\.doc\.gz$//')
# Create the directory if it doesn't exist already, then copy into it.
mkdir -p "${pathtotarget}/${year}/${month}"
cp "${pathtooriginalfiles}/${i}" "${pathtotarget}/${year}/${month}"
done
Além disso, não codifiquei exatamente o que você solicitou. Você disse que deve testar para ver se os arquivos estão lá e depois excluí-los automaticamente. Em vez disso, esse script apenas os copia e deixa os originais em paz. Eu recomendo que você "teste" manualmente para ter certeza de que faz o que você acha que deveria, em vez de confiar no script para fazer isso sozinho. (Qualquer erro na parte de cópia provavelmente seria replicado na parte de verificação.) Se você realmente quiser que o script remova os originais, basta alterar a cp
part para mv
. (Sinto que o mv é mais limpo do que copiar e excluir de qualquer maneira. Um dos motivos é que cp
não faz checksum, embora você possa usar rsync -a
.