Déplacer des fichiers par date dans un répertoire différent à l'aide de CLI

9

J'ai un grand nombre de photos d'un vieux disque dur que j'essaie d'organiser. Si je lance ls -l, je remarque que tous ces fichiers ont une date de création de 2012 ou avant. Idéalement, j'aimerais les déplacer vers le deuxième disque dur de mon ordinateur, qui n'est pas configuré pour se monter automatiquement. De préférence, je pourrais tout faire en lot avec certaines commandes liées entre elles. Jusqu'à présent, j'ai ls -l | grep -i 2012qui crache uniquement les fichiers avec 2012 à la date fournie par ls -l. Maintenant, l'astuce serait cpde placer tous ces fichiers dans le nouveau répertoire. Je ne sais pas où aller ensuite avec cela car chaque fichier devrait être copié. Quelle serait ma prochaine série de commandes?

nerdenator
la source

Réponses:

13

Ne pas utiliser ls. Il n'est pas recommandé d'utiliser dans de tels cas. De plus, utiliser greppour filtrer selon la date n'est pas une bonne idée. Votre nom de fichier peut lui-même contenir une 2012chaîne, même s'il n'a pas été modifié en 2012.

Utilisez la findcommande et dirigez 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 
shivams
la source
1
Ne sera pas "-exec mv {} / votre / répertoire / cible \;" au lieu de '-print 0 | xargs -0 cp -t / votre / répertoire / cible 'fonctionne-t-il aussi bien en ce qui concerne les problèmes avec les espaces dans les noms? (De plus, le PO voulait déplacer et non copier )
Hagen von Eitzen
^^ Oui. Les deux atteignent le même objectif.
shivams
4

Si vous avez des fichiers plus récents sur l'ancien disque que vous voulez ignorer, je procéderais comme ceci

  1. Créer un fichier marqueur temporaire avec une date de modification qui sépare les fichiers que je veux de ceux que je ne veux pas
  2. Copiez des fichiers plus anciens que le fichier marqueur vers le nouvel emplacement

Voici des exemples de commandes pour cela, qui supposent que vous souhaitez conserver toute hiérarchie de répertoires de l'ancien disque dans le nouveau ( cpioest une commande de copie, similaire à tarou 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
roaima
la source
2

Je pense que ce problème est peut-être le même que le vôtre, vous pouvez également le vérifier: créer des sous-répertoires et organiser les fichiers par date

J'écris ce nouveau script basé sur la première réponse de ce problème:

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 fichier nommé copy.shdans votre ancien répertoire.

  2. remplacez le /your/new/directorypar le chemin de votre nouveau répertoire

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

  4. puis exécutez ce fichier en ./copy.sh

bleu chaud
la source
1
Vous pouvez ajouter une gestion des exceptions, de sorte que le script ne se déplace pas lui - même dans un 2015répertoire.
G-Man dit `` Réintègre Monica ''
1

Vous devriez probablement utiliser un outil de traitement par lots pour les opérations par lots. Cela implique généralement de lire / écrire tous les enregistrements dans un seul flux plutôt que, par exemple, d'invoquer un cpprocessus distinct pour chaque fichier copié.

Il y a déjà une cpioréponse écrite ici, qui, étant donné uniquement les options déjà fournies, est probablement ce que je choisirais. Cependant, le cpioformat a été amélioré et replié dans le paxformat d'archivage standardisé depuis son apogée. Il en va de même tar.

Un POSIX strict paxne fournira probablement aucune option pour filtrer directement les membres de l'archive en fonction des temps de modification des fichiers - bien que la norme spécifie le %Tmodificateur de format en mode liste. Pourtant, l' paximplémentation la plus couramment disponible que je connaisse - qui est la version BSD maintenue par mirabilos - l'étend à un commutateur CLI directement accessible.

Par exemple, pour copier uniquement tous les fichiers de l'arborescence dont la racine a ./été modifiée ccyymmddHHMMpour la dernière fois, /target/dirvous pouvez faire:

pax -rwT,201301010000 ./ /target/dir

Pour éviter de revenir dans les répertoires enfants, vous pouvez faire à la place:

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

Voir la manpage pour en savoir plus.

mikeserv
la source
Je suppose que je devrais vraiment apprendre pax, mais taret cpioencore me suis bien. +1
roaima
@roaima - à proprement parler, bien qu'il existe un paxformat d'archive réel (qui est une extension du format ustar ) , l' pax utilitaire spécifié POSIX lit / écrit les formats cpio, pax et ustar. Étant donné que les trois types d'archives correspondent principalement à des moyens différents de coder les métadonnées de nombreux fichiers aux côtés des données réelles desdits fichiers dans un seul flux, ce n'est pas vraiment trop étiré. J'ai écrit une fois shitar- qui n'était que quelques lignes de shell-script pour - principalement dd- des développeurs de tarblocs à la volée basés sur la spécification POSIX.
mikeserv
J'aime votre script lié; étrangement, cela aurait été très utile il y a quelques mois exactement dans le même but. Tant pis. Je pourrais même essayer d'arrêter d'utiliser cpio -H ustar...
roaima