Je veux copier les fichiers à partir de la plus récente répertoire créé. Comment pourrais-je le faire sous unix?
Par exemple, si j'ai les répertoires de noms que de la date de timbre en tant que tel:
/20110311
/20110318
/20110325
source d'informationauteur jdamae
C'est la réponse à la question, je pense que vous vous posez.
Quand je traite avec de nombreux répertoires qui ont de la date/de l'heure dans le nom, je prends toujours l'approche que vous avez qui est AAAAMMJJ - la grande chose à ce sujet est que de la date de commande est alors aussi l'ordre alphabétique. Dans la plupart des shells (certainement en bash et je suis sûr à 90% des autres), le '*' expansion est effectuée par ordre alphabétique, et par défaut 'ls " retour à l'ordre alphabétique. Donc
Vous donner la première et la dernière des dates dans le répertoire.
Cela peut être étendu afin de garder uniquement les 5 dernières entrées, etc.
Je ne sais pas comment faire les backticks jouer gentil avec le système de commentaires ici. Il suffit de remplacer ces apostrophes avec backticks.
Après quelques tests, je suis venu avec les éléments suivants:
Unix stat commande est utile ici. L'option '-t' option causes stat pour imprimer sa sortie en laconique de mode (le tout en une ligne), et le 13e élément de cette laconique de sortie est le timestamp unix (nombre de secondes depuis l'époque) pour la dernière heure de modification. Cette commande affichera la liste de tous les répertoires et sous-répertoires) dans l'ordre de nouveau modifié à la plus ancienne-modified:
J'espère que le "laconique" mode de stat reste constante dans les futures versions de stat !
Voici quelques explications des options de ligne de commande utilisés:
De revenir à l'original de votre demande, pour copier des fichiers, peut-être, essayez les solutions suivantes. À la sortie d'un répertoire (le plus récente), ajouter ceci à la commande (avis de la première pipe), et de le nourrir à tous dans votre 'cp' commande avec backticks.
Le problème avec le ls de solutions basées sur, c'est qu'ils ne sont pas de filtrage juste pour les répertoires. Je pense que c':
pourrait faire l'affaire, mais notez qu'qui ne copie que les fichiers dans l'immédiat répertoire. Si vous voulez une réponse générale à une copie ci-dessous votre nouveau répertoire sur un nouveau répertoire, je pense que vous feriez mieux d'utiliser rsync comme:
mais ça dépend un peu dans les comportements que vous voulez. L'explication de la substance dans les backticks est:
.
- le répertoire courant (vous pouvez spécifier un chemin d'accès absolu ici)-mindepth/-maxdepth
de restriction d'accès à la commande rechercher uniquement pour les enfants immédiats du répertoire courant-type d
- seulement les répertoires-exec stat ..
- sorties de la date de modification et le nom du répertoire de trouversort -n -r |head -1 | awk '{print $2}'
- date de commandes le répertoire et les sorties le nom de la modification la plus récente deSi votre répertoires sont nommés
YYYYMMDD
comme votre question le suggère, profiter de la alphabétiques d'expansion.Mettre tous les répertoires dans un tableau, puis choisir le premier:
(C'est en fait un raccourci pour
first_dir="${dirs[0]}";
.)De même, pour le dernier:
Laide de la syntaxe, mais c'est ce qu'il se décompose de:
Je sais que c'est une vieille question avec un accepté de répondre, mais je pense que cette méthode est préférable car il ne tout dans Bash. Aucune raison pour frayer processus supplémentaire, sans parler de analyser les données en sortie de
ls
. (Ce qui, certes, doit être bien dans ce cas particulier deYYYYMMDD
noms.)s'il vous plaît essayer avec la commande suivante
ls -1tr | tail -1
J'ai écrit une commande qui peut être utilisé pour identifier les dossiers ou fichiers sont créés dans un dossier comme un nouveau. C'est semble pure 🙂
Celui-ci est simple et utile qui j'ai appris récemment.
Cette commande affichera les résultats dans l'ordre chronologique inverse.