加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

双引号与Bash中的星号文件名扩展

发布时间:2020-12-15 21:46:54 所属栏目:安全 来源:网络整理
导读:在目录?/ temp / a / foo /和?/ temp / b / foo foo /我有一些名为bar1,bar2,bar bar1,bar bar2等的文件. 我正在尝试编写一行Bash,将包含“foo”的目录中的所有这些文件作为名称的最后一部分复制到相应“foo”文件夹上方的文件夹中. 只要文件名中没有空格,这
在目录?/ temp / a / foo /和?/ temp / b / foo foo /我有一些名为bar1,bar2,bar bar1,bar bar2等的文件.

我正在尝试编写一行Bash,将包含“foo”的目录中的所有这些文件作为名称的最后一部分复制到相应“foo”文件夹上方的文件夹中.

只要文件名中没有空格,这是一项简单的任务,但在处理foo foo目录时,以下两个命令会失败:

for dir in `find . -type d -name '*foo'` ; do cp $dir/* "$(echo $dir|sed 's_foo__g')" ; done

(cp命令无法将“foo foo”的最后一个foo视为同一目录名的一部分.)

for dir in `find . -type d -name '*foo'` ; do cp "$dir/*" "$(echo $dir|sed 's_foo__g')" ; done

(“$dir / *”未展开.)

尝试将$dir / *替换为“$(echo $dir / *)”的尝试更不成功.

是否有一种简单的方法来扩展$dir / *以便cp理解?

解决方法

for循环不仅错误 – sed也不适合这项工作.

while IFS= read -r -d '' dir; do
  cp "$dir" "${dir/foo/}"
done < <(find . -type d -name '*foo' -print0)

在find(和IFS = read -r -d”)上使用-print0可确保带有换行符的文件名不会弄乱你.

使用< <(...)构造确保如果循环内部设置变量,更改目录状态或执行类似的操作,那些更改将继续存在(管道的右侧位于bash的子shell中,因此管道进入while循环意味着在while循环中进行的shell状态的任何更改都会在其退出时被丢弃. 使用${dir / foo /}比调用sed更有效,因为它在bash内部执行字符串替换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读