Mon objectif est d'une simplicité trompeuse (du moins pour moi). Je souhaite prendre la sortie de ls -l
ou ls -lh
et sélectionner un seul champ.
Je cherche à ce que cela soit aussi à l'épreuve des balles que possible, c'est-à-dire que je suppose que les noms de fichiers peuvent avoir un nombre variable d'espaces, tout sur le terrain n'a pas la même longueur, etc.
Points bonus pour avoir un script qui prendra le nom du champ (ou même juste un numéro de champ), puis retournera le contenu du champ.
Je veux tourner
dans:
command-line
bash
soandos
la source
la source
ls
. Lafind
commande est extrêmement utile.ls -l --block-size=M
?ls
commande n'est pas standard POSIX, donc un script qui en dépendls
pourrait se casser sur différents systèmes ou même au fil du temps. Voir la réponse de @ormaaj sur cette page pour plus de détails. Une façon de faire ce que vous demandez est avec une boucle Bash. Voici un exemple.for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
. Bien sûr, au lieu deecho
, vous utiliseriez votre traitement.... | xargs -d '\n' du -m
qui fonctionne aussi bien.-exec
option defind
.Ne jamais analyser ls . Utilisez GNU
find
. Ou si la portabilité est pas important,stat(1)
.Pour lire des données autres que des listes de noms de fichiers ligne par ligne et les diviser en champs, voir: BashFAQ / 001
Il n'existe aucune méthode pour lire de manière fiable une liste de noms de fichiers délimités par des sauts de ligne qui ont du sens dans la plupart des circonstances.
la source
Vous pouvez récupérer la colonne spécifique dans le shell comme:
ou
awk
comme indiqué dans la réponse @Corey ,cut -c44-45
fonctionnerait également après ajustement (carls
a des colonnes fixes), ou quoi que ce soit d'autre, mais le principal problème est qu'il ne sera pas fiable et à l'épreuve des balles (par exemple sur Unix, il peut l'être$6
, non$7
, et il change en fonction des arguments), ce qui le rend non convivial pour la machine, il n'est donc pas recommandé d'analyser lals
commande du tout.Le mieux est d'utiliser différentes commandes disponibles telles que
find
oustat
, qui peuvent fournir des options pertinentes pour formater la sortie selon vos besoins. Par exemple:Pour renvoyer une colonne de seulement jours de modifications, essayez cet exemple:
Il convient de noter que GNU
stat
pourrait avoir des options différentes de BSDstat
, il ne sera donc toujours pas à l'épreuve des balles sur différents systèmes d'exploitation.la source
stat
.date
cependant est mal configuré. Vous devez ajouter--date=$ymd
, cardate
en soi imprimera le jour en cours, mais le but ici est de convertir le format de date du fichierls -la | cut -c32-33
commande en toute honnêteté n'est tout simplement pas fiable, non seulement en raison des pièges possibles avec les noms de fichiers, mais simplement parce qu'elle dépend de la longueur des noms d'utilisateur et de la taille des fichiers. Lastat -c "%x" *.*
commande semble correcte, mais en l'utilisant,*.*
vous la restreignez uniquement aux noms de fichiers contenant un point. Je suppose que l'intention était d'attraper également des fichiers cachés; dans ce cas , vous devez activer les jokers pour dotfiles au préalable et utiliser au*
lieu de*.*
:shopt -s dotglob; stat -c "%x" * | [...]
.--date="$ymd"
à ladate
commande, sinon il imprimera le jour actuel du mois.