Comment faire pour copier le top 10 des plus récentes des fichiers d'un répertoire à un autre?
Al mes fichiers html résident ici :
/home/thinkcode/myfiles/html/
Je veux aller le plus récent 10 fichiers à /home/thinkcode/Test
J'ai jusqu'à présent. Merci de me corriger. Je suis à la recherche d'un one-liner!
ls -lt *.htm | head -10 | awk '{print "cp "$1" "..\Test\$1}' | sh
- Vous pouvez utiliser
xargs
et éviterawk
+sh
(se sent laid) ou probablement utiliserfind ... -exec
et exécuter une seule commande. - Je pourrais la trouver, mais me demandais juste comment faire la même chose à l'aide de awk!
- Merci de voir BashFAQ/003 et BashFAQ/099.
Vous devez vous connecter pour publier un commentaire.
ls
est notoirement mauvaises à propos de fichier de liste des noms qui ont des caractères spéciaux. Aussi, l'analyse de la sortie dels -l
est lourde de danger. Mieux d'écrire un petit script perl qui stat tous les fichiers et trier les résultats par date. Si vous devez utiliserls
, à moins de laisser sur le-l
argument...ls -t *.html | head -10
pourrait fonctionner tout aussi bien.|sh
à la fin nécessaire?Ici est une version qui n'utilise pas de
ls
. Il devrait être moins vulnérables à d'étranges caractères dans les noms de fichiers:J'ai utilisé
find
pour un couple de raisons:1) si il y a trop de fichiers dans un répertoire, bash rechignent à l'expansion des caractères génériques*.
2) à l'Aide de la
-print0
argumentfind
permet de contourner le problème de bash en élargissant les espaces dans un nom de fichier dans plusieurs jetons.* En fait, bash actions d'une mémoire tampon pour son expansion des caractères génériques et de ses variables d'environnement, il n'est donc pas strictement en fonction du nombre de noms de fichiers, mais plutôt le total de la longueur des noms de fichier et les variables d'environnement. Trop de variables d'environnement => pas d'expansion des caractères génériques.
EDIT: Intégré certains de @glennjackman des améliorations apportées. Gardé l'utilisation initiale de
find
d'éviter l'utilisation de l'expansion des caractères génériques qui peut échouer dans un grand répertoire.stat -c "%Y\t%n" *.html | sort -n | tail -10 | cut -d " " -f 2- | xargs cp -t ../Test
cut -d $'\t' ...
cut
, de sorte que vous pouvez omettre-d
tout à fait.Dans l'exemple ci-dessus
DestDir
est le répertoire de destination pour la copie.Ajouter
-t
après xargs pour voir les commandes au moment de leur exécution. I. e.,xargs -i -t cp {} DestDir
.Pour plus d'informations, consultez le la commande xargs.
MODIFIER: Comme l'a souligné @DennisWilliamson (et aussi de comparer la page de man) re la
-i
optionThis option is deprecated; use -I instead.
.Aussi, les deux solutions présentées dépendent les noms de fichiers en question ne contiennent pas d'espaces ou de tabulations.
{}
, pas*
cp *
print $NF
etprint $9
les deux échouent si les noms de fichiers comportent des espaces ou des tabulations.xargs -i
est obsolète - utiliserxargs -I {}
à la place.cp
semble comprendre l'arrière-cochée commandes. Vous pouvez utiliser une commande comme celle-ci pour copier les 10 derniers fichiers vers un autre dossier, comme par exemple/test
: