find+ls

本文介绍了一种利用find结合ls命令快速定位特定文件的方法。通过执行find/-namefilename-exec ls{}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果忘了文件存储的位置或是想要找到某个文件,find+ls最直接有效了

find / -name "filename" -exec ls {} /;

这样可以列出所有filename的路径

<think>我们正在处理用户关于find命令执行时出现'ls terminatedby signal13'错误的问题。根据用户描述,他们在使用find命令时遇到了这个错误。我们需要分析错误原因并提供解决方案。首先,我们需要了解信号13是什么。在Unix/Linux系统中,信号13是SIGPIPE,表示“管道破裂”。这个信号通常发生在进程尝试向一个已经关闭的管道写入数据时。 在find命令中,我们经常使用`-exec`或通过管道将find的输出传递给其他命令(如ls)。当find命令的输出被传递给另一个命令,而该命令在读取完所需数据后提前终止(关闭了管道的读取端),那么find命令继续向管道写入数据时就会触发SIGPIPE信号,导致写入进程(这里是findls)被终止,并显示“terminated bysignal13”。具体到用户的情况,可能是这样的命令结构: ```bashfind /path -exec ls{} \; #或者find/path -print |xargsls``` 当`ls`命令的输出被重定向到一个管道,而管道的读取端提前关闭(比如只读取了部分输出就退出的情况),那么`ls`就会收到SIGPIPE信号。 然而,值得注意的是,错误信息中明确提到了“lsterminatedby signal13”,所以问题可能出在`ls`命令上,而不是`find`本身。这意味着`find`命令正常执行,但它在执行`ls`命令时,`ls`命令因为向一个已经关闭的管道写入而收到了SIGPIPE信号。可能的原因:1.用户可能将`find -exec`或`find`与`xargs`结合使用的命令的输出通过管道传递给另一个命令,而这个命令提前退出,导致`ls`写入失败。例如:`find.-execls -l {}\; |head-n10`这里,`head`命令在读取10行后退出,而`ls`还在继续输出,于是后续的`ls`就会收到SIGPIPE。 2.也可能是由于`ls`的输出被重定向到一个文件,而该文件所在的文件系统在写入过程中变为只读(例如磁盘错误)或磁盘已满,导致写入失败。但这种情况通常会引发其他错误(如磁盘空间不足的错误),而不是SIGPIPE。 3.还有一种可能是,`ls`命令的输出被重定向到一个管道,而管道的另一端(读取端)的进程因为某种原因退出了。解决方案:1.如果用户不需要全部输出,可以使用`head`等命令来提前终止,那么SIGPIPE是预期行为,可以忽略。但是,错误信息会显示在终端上,影响观感。为了避免这个错误,可以忽略SIGPIPE信号。在bash中,可以通过设置shell选项来忽略:```bashtrap''PIPE#忽略SIGPIPE信号```或者在命令级别,使用`trap`命令来忽略:```bash(trap'' PIPE;find .-execls -l {}\;) |head -n10```但是,这种方法可能会影响整个子shell中的命令。 2.另一种方法是避免使用管道,特别是当后续命令不需要全部输出时。例如,使用`find`的`-quit`动作来在找到一定数量后退出,但这可能不适用于所有情况。3.如果用户确实需要将输出传递给另一个可能提前退出的命令,可以考虑使用工具来避免SIGPIPE。例如,使用`cat`命令来缓冲输出,因为`cat`在遇到SIGPIPE时会安静地退出,而不会显示错误信息。但是,这并不能完全避免SIGPIPE,只是将错误转移到了`cat`上。4.使用`xargs`的`-r`或`--no-run-if-empty`选项可能有助于避免运行命令,但这里的问题不是空输入,而是输出被中断。 5.更合适的做法是调整命令结构,避免产生SIGPIPE。例如,如果用户想查看前几个结果,可以使用:```bashfind. -execls -l {}\;-quit|head -n10```这样,`find`在第一个文件执行`ls`后就会退出,因此只输出一个文件的长列表,然后通过管道传递给`head`,这样就不会有多个`ls`进程,也就不会因为管道破裂而中断。 但是,上面的命令并不能保证输出行数,因为一个文件的`ls -l`输出可能有多行(比如符号链接)。所以更好的方法是使用`-print0`和`xargs -0`结合,并限制`xargs`每次执行的参数数量,然后通过`head`来限制输出行数。但这比较复杂。6.如果用户只是不想看到错误信息,可以将错误重定向到`/dev/null`,但这会隐藏所有错误,不是最佳方案。考虑到用户的具体命令未知,我们可以给出一般性建议。综上所述,我们给用户的解决方案可以如下:###原因分析在使用`find`命令执行`ls`时,如果`ls`命令的输出被重定向到一个管道,而管道的读取端提前关闭(例如,通过管道传递给`head`、`sed-q`等命令),那么`ls`会收到SIGPIPE信号(信号13)而终止,导致出现“lsterminated bysignal13”错误。###解决方案1.**忽略SIGPIPE信号**:在运行命令前忽略SIGPIPE信号,这样命令在写入管道失败时会安静地退出,而不显示错误信息。可以在命令前设置:```bashtrap ''PIPEfind /path -exec ls{}\;trap-PIPE#恢复SIGPIPE信号的处理```或者使用子shell:```bash(trap'' PIPE;find /path -exec ls{} \;)``` 2. **避免使用管道**:如果可能,避免将`find -exec`的输出通过管道传递给可能提前退出的命令。如果需要查看部分输出,可以限制`find`的执行数量:```bash#使用find的-quit动作来在找到一定数量后退出find/path -execls {}\; -quit```或者使用`xargs`的`-L`选项限制每次运行的参数数量,并结合`head`。3.**使用`xargs`处理**:使用`find`和`xargs`结合,并利用`xargs`的`-r`选项(如果支持)以及限制每次调用的参数数量,这样每次`ls`只输出一个文件的信息,然后通过管道,这样即使被中断,也只影响一个文件:```bashfind /path -print0| xargs -0 -L1ls |head -n10```这样,`xargs`每次调用`ls`只处理一个文件,然后输出该文件的信息。当`head`退出时,正在运行的`ls`会收到SIGPIPE,但后续的`xargs`不会再调用新的`ls`(因为管道已经破裂),因此错误只会发生在最后一个被调用的`ls`上,并且由于`head`已经退出,用户可能看不到所有输出,但避免了大量错误。4. **使用其他工具**:考虑使用`awk`或`sed`等工具来处理输出,这些工具可以控制退出,而不会导致管道破裂。5.**将输出重定向到文件**:如果不介意输出到文件,可以先将结果保存到文件,然后再查看文件:```bashfind /path -exec ls{} \;> /tmp/output.txthead/tmp/output.txt```6.**忽略错误信息**:如果错误信息不影响结果,可以将标准错误重定向到`/dev/null`:```bashfind/path-execls {}\;2>/dev/null```但这样会隐藏所有错误,包括可能其他重要的错误,所以不推荐。 请用户根据具体情况选择解决方案。 ###相关问题1.如何在使用`find`命令时避免管道破裂错误?2.除了SIGPIPE,还有哪些常见的信号会导致进程终止? 3.如何在使用管道时控制命令的退出行为?</think>### `find` 命令出现 "ls terminated by signal 13" 错误的原因及解决方案 #### 错误原因分析 信号 13 是 **SIGPIPE**(管道破裂),当进程尝试向一个已关闭的管道写入数据时触发。结合 `find` 命令的典型用法,常见原因包括: 1. **管道输出被提前终止** 当 `find -exec ls` 或 `find | xargs ls` 的输出通过管道(`|`)传递给其他命令(如 `head`、`grep`、`less`),若接收命令提前退出(如 `head` 读取足够行后退出),`ls` 会因继续写入已关闭的管道而收到 SIGPIPE 信号[^1][^2]。 **示例命令**: ```bash find . -exec ls -l {} \; | head -n 5 # head 退出后触发 SIGPIPE ``` 2. **输出重定向到中断的流** 若 `ls` 的输出重定向到文件或网络流,而目标突然不可用(如磁盘满、NFS 断开),也会触发 SIGPIPE。 3. **多线程环境下的兼容性问题** 某些系统(如 QNX Neutrino)在存在线程时可能限制 `fork()` 调用,间接导致信号处理异常(较少见)[^2]。 --- #### 解决方案 根据具体场景选择以下方法: ##### 1. 忽略 SIGPIPE 信号(推荐) 在命令前显式忽略 SIGPIPE,使进程安静退出而非报错: ```bash # 方案1:使用 trap 忽略信号 trap '' PIPE && find /path -exec ls -l {} \; | head -n 5 # 方案2:通过 shell 选项忽略 (set +o pipefail; find /path -exec ls -l {} \;) | head -n 5 ``` ##### 2. 避免管道提前关闭 - **使用 `xargs` 替代 `-exec`**: ```bash find /path -print0 | xargs -0 ls -l | head -n 5 ``` - **限制输出量**: ```bash find /path -exec ls -l {} \; -quit # 只处理第一个匹配项 ``` ##### 3. 检查系统资源 排查底层问题: ```bash df -h /path # 检查磁盘空间 mount | grep /path # 确认文件系统状态(如 NFS 是否正常) ``` ##### 4. 重定向错误输出(临时方案) 隐藏错误信息(不解决根本问题): ```bash find /path -exec ls -l {} \; 2>/dev/null ``` --- ### 关键点总结 | 原因类型 | 解决策略 | 适用场景 | |------------------|------------------------------|----------------------------------| | 管道提前关闭 | 忽略 SIGPIPE 或使用 `xargs` | 配合 `head`/`grep` 等命令时 | | 资源不足 | 检查磁盘/NFS | 输出到文件或网络存储时 | | 系统兼容性问题 | 更新系统或规避多线程 | QNX 等特殊环境(较少见) | > **提示**:若问题持续,使用 `strace` 追踪信号来源: > ```bash > strace -e trace=signal find /path -exec ls -l {} \; > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值