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