Question

Je suis en train de formater la sortie de ls -la pour contenir uniquement les fichiers modifiés en Décembre et les sortir bien, voici ce qu'ils regardent actuellement comme:

ls -la | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5
Dec 4 20:15 folder/
Dec 4 19:51 ./
Dec 4 17:42 Folder\ John/
Dec 4 16:19 Homework\ MAT\ 08/
Dec 4 16:05 Folder\ Smith/

etc ..

Comment puis-je créer quelque chose comme une expression régulière de ne pas inclure des choses comme « ./ » et « ../ »,

Aussi comment puis-je supprimer la barre oblique « \ » pour les dossiers qui ont des espaces en eux. Id aiment laisser tomber la barre oblique à la fin. Est-ce possible grâce à une commande shell? Ou devrais-je utiliser Perl pour apporter des modifications à l'épreuve? Je ne veux que la date et l'heure demeurera inchangé. Toute aide serait grandement appréciée!

La boîte a linux et cela se fait via SSH.

Edit:

Heres ce que j'ai jusqu'à présent (grâce à Mark et gbacon pour cela)

ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5

Im juste avoir du mal à remplacer « \ » avec juste un espace « ». Autre que cela Merci pour toute l'aide jusqu'à ce point!

Était-ce utile?

La solution

Vous pouvez utiliser find faire la plupart du travail pour vous:

find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r

Le répertoire parent (..) ne sont pas inclus par défaut. Le -mindepth 1 se débarrasse du répertoire courant (.). Vous pouvez supprimer le -maxdepth 1 pour le rendre récursif, mais vous devez changer le %f à %p pour inclure le chemin avec le nom du fichier.

Ce sont les champs de la -printf:

  • % Tb - nom court de mois
  • % Td - jour du mois
  • % TM:% TM - heures et minutes
  • % f - filename

Dans le grep J'ai ajouté un match pour le début de la ligne donc il ne correspond pas à un fichier nommé « décimal » qui a été modifié en Novembre, par exemple.

Autres conseils

Vérifiez et assurez-vous que la commande ls de votre n'aliasé à autre chose. En règle générale, « premières » ls ne vous donne pas le / pour les répertoires et ne devraient pas être les espaces échappaient.

Il est clair que quelque chose échappe les espaces pour vous pour votre awk à imprimer ces fichiers, car awk tend à briser le terrain par des espaces, c'est ce que les personnages \ sont pour.

Les espaces sont des noms de fichiers sont conçus spécifiquement pour frustrer l'écriture mashups de script facile et pipe comme vous essayez de faire ici.

Vous pouvez filtrer la sortie de ls:

ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5

Si vous êtes content d'utiliser Perl:

ls -la | perl -lane 's/\\ / /g;
                     print "@F[5..9]"
                       if $F[8] !~ m!^..?/?$! &&
                          $F[5] eq "Dec"'

Voici une de vos réponses:

  

Comment puis-je créer quelque chose comme une expression régulière de ne pas inclure des choses comme « ./ » et « ../ »,

Utiliser ls -lA au lieu de ls -la.

Au lieu d'imprimer un nombre fixe de colonnes, vous pouvez imprimer tout de la colonne 6 t la fin de la ligne:

ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } '

Je ne comprends pas les espaces backslashés, donc je ne sais pas pourquoi vous obtenez cela. Pour résoudre ce problème, vous pouvez ajouter ceci:

| sed 's/\\//g'

ce qui est avec tous les greps et seds ???

ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }'

bien que vous pouvez déposer . et .. en ajoutant grep -v "\." | grep -v "\.\."

pas sûr du reste

Il me contrarie vraiment de voir les pipelines avec awk et grep / sed. Awk est un outil de traitement de ligne très puissant.

ls -laF | awk '
    / \.\.?\/$/ {next}
    / Dec / {for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top