如何将每个子目录中最大的文件移动到当前目录?

如何将每个子目录中最大的文件移动到当前目录?

我喜欢循环遍历子目录并将最大的文件移动到其父目录,然后删除该文件夹。我尝试了很多方法,但都没有成功。

它说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

答案1

失败是因为您在当前目录中搜索,而不是在目标目录中搜索。将 find 更改为:

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

答案2

用这个

find "$d" -type f ...

代替

find . -type f ...

.是您当前的文件夹,您的意思是 提供的元素$d

相关内容