【问题标题】:Finding largest files that do not contain a string查找不包含字符串的最大文件
【发布时间】:2020-01-31 05:15:02
【问题描述】:

我正在尝试在我的媒体服务器上以 X264 或更旧格式重新编码较大的 AVI/MKV 文件。我的想法是找到尚未以 HVEC(又名 x265)格式编码的最大文件并进行转换。为此,我在服务器(Ubuntu 14.04.6)的主文件夹中使用了以下命令:

find . -printf '%s %p\n'|sort -nr|head -n 10

这可行,将 5 或 10 添加到最后一个数字将显示接下来 15 到 20 个最大的文件,但我想从列表中删除已编码为 HVEC 媒体文件以节省时间。

我已经能够使用 GREP 搜索“HVEC”,其命令类似于:

grep -Ril 'HEVC' .

以及未使用此命令进行 HEVC 编码的文件

grep -vRil x265 .

但我无法找到两个命令的组合来显示尚未编码的最大 10 个文件。我基本上是在尝试列出尚未采用 HVEC 编码的前 10 个最大文件。

谁能帮我解决这个问题?

【问题讨论】:

  • Grep 可能会产生误报。使用适当的元数据解析器

标签: ubuntu grep find


【解决方案1】:

使用zsh shell,当前目录及以下目录中所有常规文件的列表,按大小降序排列,由通配符模式给出

./**/*(.NOL)

通配符(.NOL) 中的. 使模式仅匹配常规文件,而N 使模式在此处不匹配时扩展为空(好像nullglob 已用于bash ),OL 按长度/大小降序排列匹配项。

遍历这些直到一个不包含字符串x265的文件:

for pathname in ./**/*(.NOL); do
    if ! grep -qF 'x265' $pathname; then
        break
    fi
done

$pathname 将是不包含字符串x265 的最大文件。

要获取这些文件的数组,您可以这样做

files=( ./**/*(.NOLe['! grep -qF x265 $REPLY']) )

要获取仅包含前 10 个此类文件的数组(即不包含字符串 x265 的 10 个最大文件):

files=( ./**/*(.NOLe['! grep -qF x265 $REPLY'][1,10]) )

在单列中打印数组的值:

print -rC1 -- $files

要遍历 10 个文件,请使用

for pathname in ./**/*(.NOLe['! grep -qF x265 $REPLY'][1,10])
do
    # process $pathname here
done

files=( ./**/*(.NOLe['! grep -qF x265 $REPLY'][1,10]) )
for pathname in $files; do
    # process $pathname here
done

请注意,grep -q -v expression! grep -q expression非常不同。如果有与 expression 不匹配的行,第一个将返回 true,如果有 no 行匹配 @,第二个将返回 true 987654342@.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2017-02-12
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多