Мне нравится циклично выполняться, хотя подкаталоги и перемещают самый большой файл в его родителя и затем удаляют папку. Я попробовал много вещей, но никогда не получал его работающий правильно.
Это говорит это 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
Это перестало работать, потому что Вы ищете в текущем каталоге а не цели. Измените свою находку на:
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
Используйте это
find "$d" -type f ...
вместо
find . -type f ...
.
является Вашей текущей папкой, и Вы имеете в виду элементы, обеспеченные $d
.