如何使用变量内带有空格的目录路径来捕获目录中的所有文件?

如何使用变量内带有空格的目录路径来捕获目录中的所有文件?

folder1我有一个包含空格的路径变量:

TEST=path/with\ space/to/folder1/

我想将 a 中的所有文件连接起来folder1cat但它给出了一个错误:

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+选项末尾的告诉-execfind每个命令行上容纳尽可能多的文件名(因此它运行cat次数尽可能少)。极限是ARG_MAX,在现代 Linux 系统上大约价值 200 万字节。

您也可以使用\;-+这告诉每个文件名find运行cat一次(因此会慢很多,但有时每次运行只有一个文件名正是您所需要的。其他时候,批量运行+是正确的事情)。

相关内容