![如何使用 tcsh 中的 find 命令返回每个文件夹中第一个匹配的结果?](https://linux22.com/image/135319/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20tcsh%20%E4%B8%AD%E7%9A%84%20find%20%E5%91%BD%E4%BB%A4%E8%BF%94%E5%9B%9E%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8C%B9%E9%85%8D%E7%9A%84%E7%BB%93%E6%9E%9C%EF%BC%9F.png)
我想查找.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.mb
和file3.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'/'
andOFS='/'
- 代表输入和输出字段分隔符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
.您可以find
从find -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