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