如何使用 tcsh 中的 find 命令返回每个文件夹中第一个匹配的结果?

如何使用 tcsh 中的 find 命令返回每个文件夹中第一个匹配的结果?

我想查找.mb多个大文件夹中的所有文件,但如果有许多文件符合我的搜索条件,我只想从每个文件夹返回一个文件。

文件夹结构

..
--abc
    |_scenes
    |    |__  file1.mb
    |    |__  file2.mb
    |...
--def
    |_scenes
    |    |__  file3.mb
    |    |__  file4.mb
    |...

如果我做

find /net/*/scenes -maxdepth 1 -type f -size +200M

它返回所有

file1.mb
file2.mb
file3.mb
file4.mb

我怎样才能只返回file1.mbfile3.mb

答案1

find+awk解决方案:

find /net/*/scenes -maxdepth 1 -type f -name "*.mb" \
| awk -F'/' '{ fn = $NF; $NF = "" }!a[$0]++{ print $0 fn }' OFS='/'
  • -F'/'and OFS='/'- 代表输入和输出字段分隔符
  • fn = $NF- 将最后一个字段值(即文件名)存储到变量中fn
  • !a[$0]++{ print $0 fn }- 在第一次出现唯一的目录路径(由 表示$0)时打印该行(整个文件路径)

或者使用 GNUcoreutils管道:

find /net/*/scenes -maxdepth 1 -type f -name "*.mb" -printf "%H %p\n" \
| sort -k1,1 -u | cut -d' ' -f2

答案2

您的新编辑指定您正在使用tcsh- 我最初假设您正在使用bash.您可以findfind -exec调用中调用并通过管道传输每个内部find调用以head提取第一个结果,例如

find /net/* -maxdepth 1 -exec tcsh -c "find {} -maxdepth 1 -type f -name '*.mb' -size +200M | head -1" \;

这是一个小示例演示:

# Create the directory structure
mkdir -p test/abc/scenes
mkdir -p test/def/scenes

# Create example data files
dd if=/dev/zero of=abc/scenes/file1.mb bs=201M count=1
dd if=/dev/zero of=abc/scenes/file2.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file3.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file4.mb bs=201M count=1

# Execute the find command
find ./* -maxdepth 1 -exec tcsh -c "find {} -maxdepth 1 -type f -name '*.mb' -size +200M | head -1" \;

这会产生以下输出:

./abc/scenes/file1.mb
./def/scenes/file3.mb

本来问题没有具体说明tcsh。在 中bash,您可以find从循环内调用并将每个find调用通过管道传输以head提取第一个结果,例如

for directory in /net/*/scenes; do
    find "${directory}" -maxdepth 1 -type f -name '*.mb' -size +200M | head -1;
done

这是一个小示例演示:

# Create the directory structure
mkdir -p test/abc/scenes
mkdir -p test/def/scenes

# Create example data files
dd if=/dev/zero of=abc/scenes/file1.mb bs=201M count=1
dd if=/dev/zero of=abc/scenes/file2.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file3.mb bs=201M count=1
dd if=/dev/zero of=def/scenes/file4.mb bs=201M count=1

# Execute the find command
for directory in ./*/scenes; do
    find "${directory}" -maxdepth 1 -type f -name '*.mb' -size +200M | head -1;
done

这会产生以下输出:

./abc/scenes/file1.mb
./def/scenes/file3.mb

答案3

首先使用 2 个 find 命令查找目录,然后在每个目录中进行搜索:

while read dir; do find "$dir" -name "*.mb" -maxdepth 1 | head -1 ; done << EOF
$(find /net/*/scenes -type d)
EOF

相关内容