鉴于下面的脚本,如果文件不存在,我想避免执行管道。
如果找不到文本文件,如何立即退出脚本?
ls */*.txt | grep ab1 | awk '{print $1, $1}' | sed "s/\"/\"\"/g" | xargs -L1 mv
原文由 amine 发布,翻译遵循 CC BY-SA 4.0 许可协议
test
一种快速而简短的测试存在性的方法:
test -e $FILENAME || exit
您可以通过以下方式链接它:
test -e $FILENAME && something | something-else
在这种情况下 something
和 something-else
仅在文件存在时才会执行。
例如:
➤ test -e ~/.bashrc && echo True || echo False
True
➤ test -e ./exists-not && echo True || echo False
False
另外: 请注意 [
是 test
的别名。 [[
的语义由 bash 定义,可以 在 bash 手册页上 找到
…您最好使用 find
来获取您的文件:
find ./ -maxdepth 2 -name "*ab1*.txt" -exec do-something-to-filename '{}' \;
由于 ls
的输出无法可靠解析。如果文件名存在,这也只会执行命令 do-something-to-filename
,这是我认为你正在尝试做的。
{}
将被每次调用 do-something-to-filename
的文件名替换。
原文由 brice 发布,翻译遵循 CC BY-SA 3.0 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答798 阅读✓ 已解决
2 回答3.2k 阅读
您可以通过以下方式检查文件是否存在:
如果 没有退出, 这样的事情就足够了:
-f <file>
只是您可以使用的众多条件表达式 _之一_。如果您查看 --- 下的CONDITIONAL EXPRESSIONS
bash
手册页,您会看到一大堆。如果(如问题更新中所述)您希望检查通配符是否导致文件,您可以简单地展开它,丢弃错误。如果没有,你最终会得到一个空字符串,可以用
-z
检测到:请注意,我使用
-1
强制每行一个文件,即使 Linuxls
如果输出设备不是终端(来自内存)默认情况下会这样做。那是为了以防万一您在这种情况下 不 强制每行一个的机器上尝试这个。但是请记住,如果您的文件名中有空格,则使用
ls
然后awk
提取第 1 列效果不会很好。例如,文件abc ab1.txt
将导致仅提取abc
位。Using
find
with-print0
, combined withxargs
with-0
is the usual way to properly process files which may have “special” characters in他们。您可以为find
提供许多其他选项,以确保仅处理所需的文件,例如-maxdepth
以限制您进入目录树的位置,以及-name
正确过滤文件名。但是,如果您 知道 您永远不会拥有这些类型的文件,那么使用
ls
解决方案可能没问题,只要确保您对它的缺点感到满意。