Como mover o maior arquivo em cada subdiretório para o diretório atual?

3

Eu gosto de loopar subdiretórios e mover o maior arquivo para seu pai e, em seguida, excluir a pasta. Eu tentei muitas coisas, mas nunca consegui que funcionasse corretamente.

Ele diz que mv não consegue encontrar o arquivo ou a pasta neste arquivo.

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
    
por redanimalwar 05.05.2015 / 16:32

2 respostas

4

Está falhando porque você está pesquisando no diretório atual e não no destino. Altere sua descoberta para:

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

No entanto, uma maneira mais segura seria:

#!/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

Embora isso ainda seja interrompido se os nomes dos arquivos contiverem novas linhas, pelo menos ele funcionará com nomes de arquivos que contenham espaços.

Se os seus arquivos também puderem conter novas linhas, você poderá tentar isso:

#!/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
    
por terdon 05.05.2015 / 16:58
2

Use isso

find "$d" -type f ...

em vez de

find . -type f ...

. é sua pasta atual e você se refere aos elementos fornecidos por $d .

    
por A.B. 05.05.2015 / 16:49