Est-il possible de sortir des find … -exec ls -ls ;
triés par ordre alphabétique, par nom de fichier?
Voici ma commande cron:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
Cette commande fonctionne bien, pour la plupart. Mais les résultats ne sont pas triés dans une séquence significative. Il serait très utile de les trier par le champ du nom de fichier.
ls -ls **/*(.)
ls
.Réponses:
Je suppose que vos noms de fichiers ne contiennent pas de retours à la ligne.
Utiliser
+
au lieu de;
pour terminer l'-exec
action accélère en regroupant les appels dels
. Vous pouvez trier en passant par lasort
commande; dites-lui de commencer à trier au 10e champ (les 9 premiers sont les métadonnées: blocs, autorisations, nombre de liens, utilisateur, groupe, taille et 3 champs date / heure). L'option-n
indiquels
d'utiliser des valeurs numériques pour l'utilisateur et le groupe, ce qui évite le risque que les noms d'utilisateur ou de groupe contiennent des espaces.Alternativement, avec zsh, vous pouvez vous en sortir sans aucune hypothèse sur n'importe quel nom en utilisant des qualificatifs glob pour collecter et trier les fichiers et
zargs
pour exécuterls
plusieurs fois si la ligne de commande est trop longue. Vous avez besoin de GNUls
(en particulier son-f
option) pour éviter un nouveau tri parls
(une autre approche serait d'émulerls
avec des zshzstat
).la source
Pourquoi ne pas diriger le résultat de la recherche par tri, puis exécuter ls pour chacune des lignes?
la source
POSIX a ceci à dire sur les dates dans une
ls
-l
liste ong:En tenant compte de cela et en veillant à ce qu'il y ait des sauts de ligne dans un nom de fichier, ils sont correctement globalisés avec l'
ls -q
option spécifiée POSIX également , il est relativement facile de préparer une expression régulière pour unls
résultat sansfind
:grep
pour cela et vous ne renverrez que des lignes contenant les chaînes représentant les dates d'aujourd'hui ou d'hier. La commande suivante ajoute un peu à cela:ls
les options consistent en:-a
retourner tous les fichiers dans un répertoire - y compris ceux qui commencent par un.dot
-l
longue liste-R
liste récursivement tous les répertoires enfants-c
afficher l'heure de modification plutôt que l'heure d'accès-q
retourner le shell glob?
plutôt que des caractères non imprimables ou\t
ab dans un nom de fichierCes résultats sont transmis au
|pipe
fichiersed
auquel correspond uniquement:-
(en d'autres termes - pasd
pour le répertoire) qui contiennent également votredate
.La sortie ressemble à ceci:
Oui, cela fonctionne même avec
LS_COLORS
- ce qui est probablement une faible priorité pour vouscron
bien sûr, mais, hé, vos options sont ouvertes.Dans tous les cas, cela offre des avantages importants par rapport à d'autres solutions possibles.
En premier lieu,
find
+ls
implique plusieurs invocations - cela n'implique qu'un seulls
processus, et c'est pourquoi il est capable de tout trier de manière fiable - ce qu'il fait par défaut - etsort
est donc également rendu accessoire.Toute solution impliquant
find
etsort
etls
fait à peu près tout le travail deux fois.ls
etfind
résoudra à la fois chaque chemin d'accès etstat
chaque fichier.ls
etsort
triera tous les résultats. Il est probablement préférable d'utiliser simplement le singlels
.Ensuite, bien sûr, il y a les parties
date
etsed
de cette réponse. Ce qui est important à noter à ce sujet, c'est que vous faites la partie difficile et obtenez d'abord l'expression régulière - et une seule fois - et ensuite vous ne taillez qu'une seule liste de résultats plutôt que de dire, obtenir des résultats, obtenir des résultats, trier les résultats et trier les résultats.Cela ne se casse pas sur les noms de fichiers contenant des sauts de ligne, comme le feront probablement d'autres solutions. Cette solution a ses propres mises en garde - que j'explique ensuite - mais elles sont infimes et faciles à gérer. À mon avis, c'est la solution la plus robuste ici.
Il existe deux cas dans lesquels la commande ci-dessus peut vous poser des problèmes. Le premier implique les
?
globes dans les noms de fichiers - alors que c'est déjà une solution plus robuste que toute autre proposée ici, et la probabilité que vous rencontriez un?
du tout est assez petite en soi, il est possible que la résolution de ces globs pourrait correspondre à plus d'un nom de fichier. S'il vous plaît voir ce pour plus d' informations à ce sujet.L'autre possibilité implique un faux positif - par exemple, si vous avez un nom de fichier correspondant réellement à la
date
chaîne pour laquelle nous recherchons,grep
mais qui n'a pas été réellement modifié aucun de ces jours. Je ne compte pas sur le fait que ce soit un problème, mais, si c'est le cas, posez des questions à ce sujet et je peux probablement vous aider à rendre l'expression régulière plus spécifique afin de gérer cela.la source
Vous pouvez réellement utiliser une combinaison de find, xargs et ls.
Voici un exemple de commande:
find . -type f -print0 | xargs -0 ls -lt
find
recherchera récursivement tous les fichiers du répertoire courant.ls
commande en un seul appel (à condition defind
renvoyer moins deARG_MAX
fichiers).ls -lt
triera ces fichiers par heure et formatera la sortieAfin de récupérer votre système,
ARG_MAX
vous pouvez taper:la source
la source
ls
fait son propre tri, donc canaliser la sortie defind
throughsort
est inutile. De plus, votre commande modifie les noms de fichiers contenant des espaces (entre autres) et échouera s'il y a trop de noms de fichiers.