Как перемещение самый большой файл в каждом подкаталоге к текущему каталогу?

Мне нравится циклично выполняться, хотя подкаталоги и перемещают самый большой файл в его родителя и затем удаляют папку. Я попробовал много вещей, но никогда не получал его работающий правильно.

Это говорит это mv наклон находит файл или папку на этом.

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

Сценарий:

#!/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
3
задан 7 May 2015 в 14:30

2 ответа

Это перестало работать, потому что Вы ищете в текущем каталоге а не цели. Измените свою находку на:

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

Однако более безопасный путь был бы:

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

, В то время как это все еще повредится, если Ваши имена файлов будут содержать новые строки, по крайней мере, это будет работать с именами файлов, содержащими пробелы.

<час>

, Если Ваши файлы могут также содержать новые строки, можно попробовать это вместо этого:

#!/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
4
ответ дан 1 December 2019 в 15:25

Используйте это

find "$d" -type f ...

вместо

find . -type f ...

. является Вашей текущей папкой, и Вы имеете в виду элементы, обеспеченные $d.

2
ответ дан 1 December 2019 в 15:25

Другие вопросы по тегам:

Похожие вопросы: