folder1
我有一个包含空格的路径变量:
TEST=path/with\ space/to/folder1/
我想连接一个folder1
with中的所有文件cat
,但它给出了一个错误:
cat "$TEST"* > test
cat: path/with: No such file or directory
cat: 'space/to/folder1/*': No such file or directory
当我尝试直接这样做时,cat path/with\ space/to/folder1/ > test
它会起作用。
此外,它适用于双引号:
TEST="path/with space/to/folder1/"
cat "$TEST" > total
但是如何通过\
路径正确地做到这一点?
我会为此使用
find
它的选项。-exec
例如:该
-maxdepth 1
选项防止递归到“$TEST”下的子目录。您可以根据需要更改或删除它。-type f
仅匹配常规文件(即排除目录、命名管道、符号链接等)。如果您希望它匹配特定的文件名模式,您可以使用
-name
或-regex
选项(例如-name '*.txt'
)或不区分大小写的-iname
/-iregex
。find
有更多的选择并且非常灵活 - 但它也非常复杂并且需要花费时间和精力来学习它的所有功能。不过,这种努力是值得的。阅读手册页并练习 :-)值得注意的一件事是,
find
默认情况下, 的谓词是用 AND 运算在一起的。这意味着如果你有-name '*.txt' -name '*.csv'
那么它会尝试同时匹配以 .txt 和 .csv 结尾的文件(这是不可能的,所以它不会匹配任何东西)。要对谓词进行 OR,您需要执行以下操作:这将匹配以 .txt 或 .csv 结尾的文件。OR-ed 谓词在括号中以将它们分组,与算术相同。整行读作“在目录 $TEST 中查找最大深度为 1 的文件,这些文件是常规文件并且(名称以 .txt 或 .csv 结尾)并对它们执行 cat。将输出重定向到名为 test 的文件”
同样值得注意的是:这
{}
是选项中文件名的占位符-exec
。选项末尾+
的-exec
告诉find
在每个命令行上放置尽可能多的文件名(因此它运行的cat
次数越少越好)。限制是ARG_MAX,在现代 Linux 系统上大约 200 万字节。您也可以使用
\;
而不是+
- 这告诉每个文件名find
运行cat
一次(所以会慢很多,但有时每次运行只有一个文件名正是您所需要的。其他时候,批量运行+
是正确的)。