【发布时间】:2013-10-31 11:16:41
【问题描述】:
如何在目录中搜索文件,按大小排序,然后将最大的文件复制到另一个目录。
我已经看到了点点滴滴..还没有解决它。
我试过下面的代码。但是,它不起作用。
find sourceDirectory -type f -exec ls -s {} \; | sort -n -r | head -1 | cp {} targetdirectory
【问题讨论】:
如何在目录中搜索文件,按大小排序,然后将最大的文件复制到另一个目录。
我已经看到了点点滴滴..还没有解决它。
我试过下面的代码。但是,它不起作用。
find sourceDirectory -type f -exec ls -s {} \; | sort -n -r | head -1 | cp {} targetdirectory
【问题讨论】:
花括号符号 ({}) 用于 find 的 -exec 选项的参数中,在这种情况下它对 cp 没有意义。您需要将其拆分为两个单独的步骤,1) 查找文件,以及 2) 复制文件。
如果您使用的是 GNU find,我建议您这样做:
read size filepath < <(find . -type f -printf '%k %p\n' | sort -nr)
cp "$filepath" target/path/
这是避免临时变量的替代方法:
cp "$(find . -type f -printf '%k %p\n' | sort -nr | head -n1 | cut -d' ' -f2-)" target/path/
你可以替换 -printf '%k %p\n' by-exec ls -s {} \;` 但 printf 效率更高。
请注意,如果文件名包含非 ASCII 字符,则可能需要特别注意。
【讨论】:
-exec 运行复制命令。请参阅我的编辑以了解避免临时变量的替代方法。
你快到了。只是需要awk和xargs的额外支持
我更喜欢使用du 代替ls -s,尽管在这种情况下它们都可以正常工作。
find <sourceDirectory> -type f -exec du {} \; | sort -nr | head -1 | awk '{print $2}' | xargs -I file cp file <targetdirectory>
【讨论】: