相关疑难解决方法(0)

如何运行 find -exec?

我想在当前目录中找到包含文本“chrome”的文件。

$ find . -exec grep chrome
find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

find

675
推荐指数
6
解决办法
110万
查看次数

如何仅循环遍历 bash 中的目录?

我有一个文件夹,里面有一些目录和一些文件(有些是隐藏的,以点开头)。

for d in *; do
 echo $d
done
Run Code Online (Sandbox Code Playgroud)

将遍历所有文件和目录,但我只想遍历目录。我怎么做?

bash directory files

389
推荐指数
6
解决办法
60万
查看次数

为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?

或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。

我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。

我遇到了如下问题:

  • 我有一个包含空格的文件名hello world,它被视为两个单独的文件helloworld.
  • 我有一个带有两个连续空格的输入行,它们在输入中缩小为一个。
  • 前导和尾随空格从输入行中消失。
  • 有时,当输入包含其中一个字符时\[*?,它们会被一些文本替换,这实际上是文件的名称。
  • 输入中有一个撇号'(或双引号"),在那之后事情变得很奇怪。
  • 输入中有一个反斜杠(或者:我使用的是 Cygwin 并且我的一些文件名具有 Windows 样式的\分隔符)。

这是怎么回事,我该如何解决?

shell bash shell-script quoting whitespace

341
推荐指数
3
解决办法
32万
查看次数

如何列出按大小排序的所有文件

我想按大小从大到小的顺序列出所有文件,这些文件可以存在于某个文件夹中的任何位置。

linux ls files

317
推荐指数
6
解决办法
62万
查看次数

为什么*不*解析`ls`(以及该怎么做)?

我一直看到引用此链接的答案明确指出“不要解析ls!” 这让我感到困扰有几个原因:

  1. 似乎该链接中的信息已被批量接受,几乎没有问题,尽管我可以在随意阅读中至少挑出一些错误。

  2. 该链接中所述的问题似乎也引发了不想找到解决方案的愿望。

从第一段:

...当你要求[ls]一个文件列表时,有一个大问题:Unix 允许文件名中的几乎任何字符,包括空格、换行符、逗号、管道符号,以及几乎任何你曾经尝试用作除 NUL 外的分隔符。...ls用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。并且由于我不知道任何ls允许您使用 NUL 字符而不是换行符终止文件名的实现,这使我们无法使用ls.

无赖,对吧?如何以往我们可以处理一个换行符终止的上市数据集可能包含换行符的数据?好吧,如果这个网站上回答问题的人不是每天都做这种事情,我可能会认为我们遇到了麻烦。

事实是,大多数ls实现实际上提供了一个非常简单的 api 来解析它们的输出,我们一直在做,甚至没有意识到。您不仅可以以 null 结束文件名,还可以以 null 或您可能需要的任何其他任意字符串开头。更重要的是,您可以为每个文件类型分配这些任意字符串。请考虑:

LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 4$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul …
Run Code Online (Sandbox Code Playgroud)

ls shell

249
推荐指数
8
解决办法
5万
查看次数

为什么使用 shell 循环处理文本被认为是不好的做法?

在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?

正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念可靠性易读性性能安全性

这个答案解释了可靠性易读性方面:

while IFS= read -r line <&3; do
  printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)

为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置read shell一次读取一个字符。

怎么样的概念安全性方面?

shell text-processing

241
推荐指数
4
解决办法
5万
查看次数

循环遍历名称中带有空格的文件?

我编写了以下脚本来比较两个目录的输出,其中包含所有相同的文件:

#!/bin/bash

for file in `find . -name "*.csv"`  
do
     echo "file = $file";
     diff $file /some/other/path/$file;
     read char;
done
Run Code Online (Sandbox Code Playgroud)

我知道还有其他方法可以实现这一目标。奇怪的是,当文件中有空格时,这个脚本会失败。我该如何处理?

find 的示例输出:

./zQuery - abc - Do Not Prompt for Date.csv
Run Code Online (Sandbox Code Playgroud)

scripting bash find text-processing filenames

187
推荐指数
6
解决办法
25万
查看次数

什么时候需要 xargs?

xargs命令总是让我困惑。是否有一般规则?

考虑下面的两个例子:

$ \ls | grep Cases | less
Run Code Online (Sandbox Code Playgroud)

打印与“案例”匹配的文件,但将命令更改为touch将需要xargs

$ \ls | grep Cases | touch
touch: missing file operand
Try `touch --help' for more information.

$ \ls | grep Cases | xargs touch
Run Code Online (Sandbox Code Playgroud)

command-line xargs

140
推荐指数
5
解决办法
6万
查看次数

如何将目录中的所有(文本)文件合并为一个?

我有 14 个文件都是一个文本的一部分。我想将它们合二为一。怎么做?

text-processing files

130
推荐指数
4
解决办法
34万
查看次数

如何将文件列表传递给 grep

我正在使用find并获取我想要grep通过的文件列表。我如何通过管道将该列表传递给grep

grep pipe find

121
推荐指数
2
解决办法
14万
查看次数