当路径在变量中时,使用忽略列表复制文件夹会引发错误

当路径在变量中时,使用忽略列表复制文件夹会引发错误

我只是想复制一个文件夹并省略一些内容。

这样就可以了:复制目录并/stuff省略其中的文件夹foomoo

cp -r ./myDir/stuff/!(foo|moo) "$destination"

但这并不

local dir="./myDir/stuff";
cp -r "$dir"!(foo|moo) "$destination"

抛出错误

syntax error near unexpected token `('

我很不擅长将表达式与变量连接起来,花了一个小时尝试使用括号和其他一些方法,但没有成功

答案1

cp 不执行正则表达式,但你可以这样做

dir="./myDir/stuff/"
dest="/stuff"
cp -r $(ls -1 "$dir" | grep -v foo | grep -v bar  ) "$dest" 

分解

  • dir="./myDir/stuff/"将变量设置dir./myDir/stuff/引号是为了防止通配符,也就是说如果你这样做/foo/bar *2000/"/foo/bar *2000"第一个将是两个参数,并且还会添加额外的东西,而第二个将是一个参数

  • dest="/stuff"相同但设置dest变量

  • cp -r $(ls -1 "$dir" | grep -v foo | grep -v bar ) "$dest"

  • 第一个cp -r副本,但它也会复制目录

  • $(commands )运行命令,然后将它们用作参数,注意这里仍然是一个全局变量,这很好,因为 bash 会使用空格和换行符并将它们用作单独的参数,因此文件1 2 3 4不会被视为一个东西,注意如果你不想要全局变量,请使用引号

  • ls -1 "$dir" 列出内容$dir并在换行符上输出每个内容

  • |通过管道将文本从 stdout 传输到下一个命令的 stdin 中,并使用名称管道

  • grep -vgrep 但不是只列出匹配的行,而是列出除匹配之外的所有内容

  • )接近$(

  • “$dest” 告诉 cp 要复制的目的地,注意引号以防止出现全局

我希望这能回答你的问题,我为此付出了很多努力

相关内容