web-dev-qa-db-fra.com

Comment ajouter plusieurs recherches dans la commande awk

J'essaie de rechercher les fichiers créés en juin, juillet et août. J'ai utilisé cette méthode

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

mais cela ne fonctionne pas.

10
OmiPenguin

Vous pouvez correspondre à plusieurs modèles comme:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

Cela renvoie tous les matchs pour Jun, juillet ou août, vous n'avez pas besoin de l'instruction print comme c'est awk 's Action par défaut.

12
jasonwryan

En règle générale, c'est une très mauvaise idée de analyser la sortie de LS . Une meilleure façon de faire ce que vous voulez est

stat -c "%n %y" * | grep 2013-0[678]

Alternativement, cochez uniquement le dernier champ à protéger contre le cas improbable où le nom du fichier lui-même est une date:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

De man stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new‐
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name
5
terdon

ls est une commande pour afficher des informations sur les fichiers d'un humain lisible. Ne l'utilisez pas dans les scripts .

La commande de trouver des fichiers dans une arborescence de répertoire correspondant à certains critères est find . Si vous avez GNU Trouver (c'est-à-dire Linux non incorporé Linux ou Cygwin) ou FreeBSD Trouver (c'est-à-dire FreeBSD ou OSX), vous pouvez utiliser -newermt Pour correspondre aux fichiers de dernière modification après une certaine date.

find . -newermt '1 June' ! -newermt '1 September' -print

Ajouter une année si vous souhaitez faire correspondre des fichiers d'une année spécifique, plutôt que l'année civile lorsque le script est exécuté.

Si votre implémentation de recherche n'a pas -newermt, vous devrez faire avec -newer, qui compare la date du fichier que find trouvé avec un fichier fixe. Utilisez touch pour créer des fichiers temporaires avec la date à laquelle vous souhaitez utiliser comme limite.

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"