Déplacer les files par date dans un directory différent à l'aide de CLI

J'ai un grand nombre de photos d'un vieux disque dur que j'essaye d'organiser. Si je cours ls -l , je remarque que tous ces files ont une date de création de 2012 ou avant. Idéalement, j'aimerais les déplacer sur le deuxième disque dur de mon ordinateur, qui n'est pas configuré pour le monter automatiquement. De preference, je pourrais faire tout cela comme un lot avec des commands liées set. Jusqu'à présent, j'ai ls -l | grep -i 2012 ls -l | grep -i 2012 qui crache seulement les files avec 2012 dans la date fournie par ls -l . Maintenant, l'astuce serait cp tous ces files dans le nouveau directory. Je ne sais pas où aller ensuite avec cela parce que chaque file devrait être copié. Quel serait mon prochain set de commands?

N'utilisez pas ls . Il n'est pas recommandé d'utiliser dans de tels cas. En outre, utiliser grep pour filterr en fonction de la date n'est pas une bonne idée. Votre nom de file peut contenir la string 2012 , même si elle n'a pas été modifiée en 2012.

Utilisez la command find et canalisez sa sortie.

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

Ici,

 -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 

Si vous avez des files plus récents sur l'ancien disque que vous voulez ignorer, je le ferais comme ça

  1. Créez un file de marqueur temporaire avec une date de modification qui sépare les files que je veux de ceux que je ne possède pas
  2. Copier les files plus anciens que le file marqueur vers le nouvel location

Voici des exemples de commands qui supposent que vous voulez conserver la hiérarchie des directorys de l'ancien disque dans le nouveau ( cpio est une command de copy similaire à 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 

Je pense que peut-être que cette question est la même que la vôtre, vous pouvez également vérifier ceci: Créer des sous-directorys et organiser les files par date

J'écris ce nouveau scénario basé sur la première réponse de ce numéro:

 for x in *; do d=$(date -r "$x" +%Y) mkdir -p "/your/new/directory/$d" mv -- "$x" "/your/new/directory/$d/" done 
  1. écrire ce script dans un file nommé copy.sh dans votre ancien directory.

  2. remplacez le /your/new/directory par le path de votre nouveau directory

  3. rendre ce file exécutable avec chmod +x copy.sh

  4. puis exécutez ce file par ./copy.sh

Vous devriez probablement utiliser un outil de traitement par lots pour les opérations par lots. Cela implique généralement la lecture / écriture de tous les loggings dans un seul stream plutôt que, par exemple, l'invocation d'un process cp séparé pour chaque file copié.

Il y a déjà une réponse cpio écrite ici, qui, étant donné seulement les options déjà fournies vous est probablement ce que je choisirais. Cependant, le format cpio a été amélioré et plié dans le format d'archive pax standardisé depuis son apogée. Il en est de même pour le tar .

Un POSIX- pax ssortingctement ne fournira probablement aucune option pour filterr directement les membres d'archives en fonction des time de modification des files – bien que le standard spécifie le modificateur de format %T list-mode. Cependant, l'implémentation de pax la plus courante que je connaisse – qui est la version BSD maintenue par mirabilos – étend cette fonction dans un commutateur CLI directement accessible.

Par exemple, pour ne copyr que tous les files de l'arborescence racine à ./ qui ont été modifiés pour la dernière fois avant ccyymmddHHMM vers /target/dir vous pouvez:

 pax -rwT,201301010000 ./ /target/dir 

Pour éviter d'être récursif dans les directorys enfants, vous pouvez le faire à la place:

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

Voir la page de manuel pour plus d'informations.