2014-06-27 4 views
0

Dans un répertoire contenant des milliers de fichiers versionnés (format ls -v, nomfichier ... nomfichier (n)), comment conserver uniquement la plus grande ou la plus petite taille (en octets, pas en version) de chaque fichier? Bonus supplémentaire s'il est également possible de garder les plus petits et les plus gros, le cas échéant. Conserver comme dans supprimer tous les autres.Conserver uniquement le fichier versionné le plus grand/le plus petit dans un répertoire?

Tous les outils shell unix habituels, préférez éviter xargs (le système hôte n'a pas installé xargs).

On peut croire que n'importe quel nom de fichier se terminant par (nombre) .ext est un fichier versionné.

+0

Un peu difficile de répondre - pas assez d'informations. Si vous n'avez pas xargs, avez-vous la version gnu de la commande 'find'? Les filanems peuvent contenir des espaces ou des caractères étranges, comme des sauts de ligne? Les fichiers sont nommés "fichier.NNN.ext" ou "fichierNNN.ext"? Le numéro de version est un nombre ou plusieurs nombres reliés avec des points, comme 'file.1.5.4.ext'. Avez-vous d'autres commandes de base, comme' grep' 'sed'' sort' et comme? – jm666

+0

Aucun gnu ne trouve non plus. Ce n'est pas une limite stricte que je peux bien sûr monter à distance sur les disques mais je préférerais le faire fonctionner à l'hôte qui est une boîte très simple. Toutes les commandes de shell habituelles mais très probablement pas de variations de GNU. – kilves76

+0

Le numéro de version est toujours un nombre entre parenthèses filename (n) .ext (par exemple "filename (3) .ext", le fichier original est "filename.ext") et il est garanti qu'il n'y a pas d'autres nombres entre parenthèses dans les noms de fichiers . Les noms de fichiers normaux, l'espace est correct, les choses amusantes comme les sauts de ligne ne l'est pas. – kilves76

Répondre

0

Il a fallu un peu de temps pour démarrer, en particulier parce que ls -S ne fonctionnait pas correctement (c'est un serveur de fichiers soho bas de gamme avec 2.6 noyaux et anciennes versions mem à peu près tout), mais le noyau de l'idée est de trier les versions de chaque fichier avec tri, si chmod, owner et group sont tous les mêmes, il triera en fonction de la taille.

ls -1p | grep -v/| sed 's/ *([0-9]*)//' | sed 's/\.ext//' | uniq | \ 
awk '{system("ls -l \""$0"\"\* | sort -r | head -n 1")}' | \ 
sed 's/.*[0-9][0-9]:[0-9][0-9] //' > largest.txt 

Une solution de fantaisie serait enlever à la fois le plus petit et le plus grand à l'intérieur de l'appel système awk avec un autre awk et exécutez rm pour les entrées restantes, mais mon awk est très rouillé.

Questions connexes