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
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
écrire ce script dans un file nommé copy.sh
dans votre ancien directory.
remplacez le /your/new/directory
par le path de votre nouveau directory
rendre ce file exécutable avec chmod +x copy.sh
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.