Mover arquivos por data para um diretório diferente usando o CLI

7

Eu tenho um grande número de fotos de um disco rígido antigo que estou tentando organizar. Se eu executar ls -l , observo que todos esses arquivos têm uma data de criação de 2012 ou anterior. Idealmente, gostaria de movê-los para o segundo disco rígido do meu computador, que não está configurado para ser montado automaticamente. De preferência, eu poderia fazer isso tudo como um lote com alguns comandos ligados entre si. Até agora, eu tenho ls -l | grep -i 2012 , que cospe apenas os arquivos com 2012 na data fornecida por ls -l . Agora, o truque seria cp 'ing todos esses arquivos para o novo diretório. Não tenho certeza para onde ir em seguida, porque cada arquivo teria que ser copiado. Qual seria o meu próximo conjunto de comandos?

    
por nerdenator 24.05.2015 / 16:32

4 respostas

8

Não use ls . Não é recomendado usar em tais casos. Além disso, usar grep para filtrar de acordo com a data não é uma boa ideia. Seu nome de arquivo pode conter 2012 string, mesmo que não tenha sido modificado em 2012.

Use o comando find e canalize sua saída.

find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory 

Aqui,

-newermt 20120101  ==>  File's modified date should be newer than 01 Jan 2012
-not               ==>  reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0     ==>  Use this options so that the command doesn't fail when filenames contain spaces 
    
por 24.05.2015 / 16:55
4

Se você tem arquivos mais novos no disco antigo que você deseja ignorar, eu faria assim

  1. Crie um arquivo de marcador temporário com uma data modificada que separe os arquivos que eu quero daqueles que eu não tenho
  2. Copie os arquivos mais antigos que o arquivo do marcador para o novo local

Aqui estão exemplos de comandos para isso, que assumem que você deseja manter qualquer hierarquia de diretórios do disco antigo no novo ( cpio é um comando de cópia, semelhante a tar ou pax ):

touch -t 201201010000 /tmp/marker    # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk
    
por 24.05.2015 / 17:01
2

Acho que talvez este problema seja o mesmo que o seu, você também pode verificar isso: Crie subdiretórios e organize arquivos por data

Eu escrevo este novo script com base na primeira resposta do problema:

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. escreva este script em um arquivo chamado copy.sh em seu diretório antigo.

  2. substitua o /your/new/directory pelo caminho do seu novo diretório

  3. torne este arquivo executável com chmod +x copy.sh

  4. execute este arquivo por ./copy.sh

por 24.05.2015 / 20:10
1

Você provavelmente deve usar uma ferramenta em lote para operações em lote. Fazer isso geralmente implica ler / gravar todos os registros em um único fluxo, em vez de, por exemplo, invocar um processo cp separado para cada arquivo copiado.

Já existe uma resposta cpio escrita aqui, a qual, dadas apenas as opções já fornecidas, é provável que você escolheria. No entanto, o formato cpio foi melhorado e dobrado no formato padronizado% archive pax desde seu auge. O mesmo acontece com tar .

Um estritamente POSIX- pax provavelmente não fornecerá nenhuma opção para filtrar diretamente os membros do archive com base nos tempos de modificação do arquivo - embora o padrão especifique o modificador de formato %T list-mode. Ainda assim, a implementação mais comumente disponível de pax que eu conheço - que é a versão BSD mantida por mirabilos - estende isso para um switch CLI diretamente acessível.

Por exemplo, para copiar somente todos os arquivos da árvore com raiz em ./ que foram modificados pela última vez antes de ccyymmddHHMM to /target/dir , você poderia fazer:

pax -rwT,201301010000 ./ /target/dir

Para evitar recursão em diretórios filhos, você pode fazer isso:

pax -rwdT,201301010000 ./* /target/dir

Veja a página man para saber mais.

    
por 25.05.2015 / 05:50