3 votes

Comment déplacer le plus gros fichier de chaque sous-répertoire vers le répertoire courant ?

J'aime parcourir les sous-répertoires en boucle et déplacer le plus gros fichier vers son parent, puis supprimer le dossier. J'ai essayé de nombreuses choses mais je n'ai jamais réussi à le faire fonctionner correctement.

Il est dit que mv Je ne trouve pas le fichier ou le dossier sur celui-ci.

dir[123]/something.mkv
dir[123]/something-small.txt
dir[555]/otherthing.mkv
dir[555]/otherthing-small.txt

script :

#!/bin/bash

for d in */ ; do
    FIND=$(find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 1)
    echo "$d${FIND##*/}"
    mv "$d${FIND##*/}" .
done

4voto

Stewart Points 1385

Il échoue parce que vous recherchez dans le répertoire courant et non dans le répertoire cible. Changez votre recherche en :

find "$d" -type f -exec ls -al {} \; | sort -nr -k5 | head -n 1

Cependant, un moyen plus sûr serait :

#!/bin/bash
for d in */ ; do
    file=$(find "$d" -type f -printf "%s\t%f\n" | sort -n | tail -n 1 | cut -f 2- )
    echo "$file"
    mv "$d${file}" .
done

Bien que cela ne fonctionne toujours pas si vos noms de fichiers contiennent des nouvelles lignes, cela fonctionnera au moins avec les noms de fichiers contenant des espaces.


Si vos fichiers peuvent également contenir des nouvelles lignes, vous pouvez essayer ceci à la place :

#!/bin/bash
for d in */ ; do
    max=0
    file=""
    for f in "$d"/*
    do
        ## If this is a file and its size is greater than the max so far,
        ## save it as "$file" and uts size as "$max".
        [[ -f "$f" ]] && [[ $(stat -c "%s" "$f") -gt $max ]] && max="$size" && file="$f"
    done
    ## move the largest file. Use "mv -i" to be prompted before overwriting. 
    mv "$file" .
done

2voto

A.B. Points 84870

Utilisez cette

find "$d" -type f ...

au lieu de

find . -type f ...

. est votre dossier actuel et vous voulez dire les éléments fournis par $d .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X