bash - Bash 递归删除前导下划线
问题描述
我正在尝试从某些 scss 文件中递归删除前导下划线。这就是我所拥有的。
find . -name '*.scss' -print0 | xargs -0 -n1 bash -c 'mv "$0" `echo $0 | sed -e 's:^_*::'`'
当我在特定目录中时,这非常有效:
for FILE in *.scss; do mv $FILE `echo $FILE | sed -e 's:^_*::'`; done
我在查找中做错了什么?
解决方案
由于起点是.
,所有find
打印的路径都以点开头。因此^_*
不匹配任何内容并sed
返回其输入不变。
我不会sed
打扰xargs
。
下面的脚本适用于任何find
并sh
没有被严重破坏的脚本,并且可以正确处理中间带下划线的文件名。
find . -name '_*.scss' -exec sh -c '
for fp; do # pathname
fn=${fp##*/} # filename
fn=${fn#"${fn%%[!_]*}"} # filename w/o leading underscore(s)
echo mv "$fp" "${fp%/*}/$fn"
done' sh {} +
bash 中一个不太便携但更短且更清洁的替代方案如下所示:
shopt -s globstar extglob nullglob
for fp in ./**/_*.scss; do
echo mv "$fp" "${fp%/*}/${fp##*/+(_)}"
done
echo
如果输出看起来不错,则丢弃。
推荐阅读
- php - 带有作曲家的交互式 PHP 脚本
- ios - 在 Int Swift 中插入一个字符
- c# - 写2个几乎相同的函数更好,还是根据输入变量确定逻辑
- kaa - 是否可以在 KAA IoT 解决方案中将文件传输到端点?
- python-3.x - 使用 urllib.error 中的 try catch 检查连接状态时发生另一个异常
- python - Qlik sense ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:749)
- laravel - 我应该如何在 Laravel 包中输入提示 UserModel?
- sql - 递归关系的实现
- vba - 使用 VBA 在 IE11 中关闭框架通知栏
- php - PHP Parse 错误:语法错误,第 56 行出现意外的“[”