我想删除目录中一定数量的最大文件。
我可以通过以下方式获取前十个文件名:
ls -S | head
(或者更丰富但更复杂的解析ls -lS | head
)
我如何将它们传递给 rm ?通过 xargs ?
那么可以ls -S | head | xargs rm
工作(即使文件名带有空格等?)
有更好/更安全的方法吗?
抱歉,但我无法自己测试这个,因为担心出错(目录中有我真的不想删除的东西)。
我用的是macOS。
答案1
那么可以
ls -S | head | xargs rm
工作(即使文件名带有空格等?)
没有。xargs
默认情况下,在任何空格上分割,而不仅仅是换行符。而且您看不到| xargs echo
, 因为echo
会打印它的所有参数,并用空格分隔。 (类似的东西| xargs printf "%s\n"
会打印它们并用换行符分隔,这样您就会看到分割是否发生在文件名的中间。)
至少 GNU xargs 必须-d '\n'
仅在换行符上拆分,并且许多版本的 xargs 必须-0
在 NUL 字符上拆分(它与 一起使用find -print0
)。您至少需要第一个,但在一般情况下,文件名也可能包含换行符,在这种情况下head
也没有多大好处。
我有义务警告你解析 的输出ls
被认为是错误的,显然,即使不存在换行符,至少某些版本也会破坏输出。 (不过,如果你没有换行符或不可打印的字符,你可能是安全的。也许吧。)
答案2
我会使用不同的方法。像这样的东西:
size=20000 # set a limit (in bytes), above these we will delete
for file in *
do
[[ -f "$file" ]] || continue
fileSize=$(stat --format "%s" "$file")
if (( $fileSize > $size )) # if file is bigger than 20000 bytes
then
rm "$file" # delete the file
fi
done
这样,您将能够删除其中包含空格的文件,并可以使用$size
变量决定哪些文件实际上是“大”。如果您想在每次删除之前收到提示,请使用-i
开关:rm -i
编辑:
我刚刚意识到您正在 OS X 下运行此程序。目前我无法访问任何装有 OS X 的计算机,可能存在 OS Xstat
具有不同格式来获取大小的风险。换句话说,该--format "%s"
选项可能不起作用。检查man stat
OS X!
答案3
我会一起去;
find . -type f -size +10M -delete -print
如果你真的想走 ls 的路,也许;
ls -S | head -1 | while read af; do rm "$af"; done
答案4
使用桀骜。它有一种按大小(以及更常用的按日期)排序和选择文件的方法。 Zsh 是 OSX/macOS 上标准安装的一部分,但可能需要在其他 Unix 变体上单独安装。
使用名称以外的条件选择(和排序)文件的方法是全局限定符。例如,要列出目录中最大的 10 个文件,请使用OL
按大小递减排序 (我ength)并[1,10]
列出前 10 个:
ls -ldU *(OL[1,10])
在没有 zsh 的情况下执行此操作会更加复杂,特别是如果您需要处理包含特殊字符的文件名。只要您的文件名不包含不可打印的字符或换行符,您就可以解析ls
.
ls -S | head -n 10 | while read -r filename; do echo rm -- "$filename"; done