bash - 递归删除目录中的尾随空格
问题描述
结构
/some/dir/a b c d /somedir2/somedir4
/some/dir/abcderf/somedir123/somedir22
问题 需要递归删除目录中的尾随空格,在示例中,“ a b c d
”末尾有一个空格,“ somedir22
”末尾可能有一个空格,需要删除。
有数百个目录,并且希望递归地迭代每个目录以检查目录是否有尾随空格,如果有,则重命名不带空格的目录。Bash 是我目前唯一的选择,因为它在 Western Digital NAS 上运行。
解决方案
我认为最糟糕的是,每次您mv
创建一个目录时,该目录中的目录都会更改路径。
所以我们需要find
在目录本身之前处理每个子目录。感谢@thatotherguy 提供-depth
需要传递给find
. 使用一些花哨-exec
的 sh 脚本,我们可以只find
处理所有以尾随空格结尾的目录,并在目录本身之前处理每个目录的内容。对于每个目录,运行一个 shell 脚本,它会删除尾随空格并mv
s 目录:
find . -type d -regex '.* ' -depth \
-exec sh -c 'mv -v "$1" "$(echo "$1" | sed "s/ *$//")"' -- {} \;
@edit 我留下我之前的答案作为参考:
find . -type d -regex '.* ' -printf '%d\t%p\n' |
sort -r -n -k1 | cut -f2- |
xargs -d '\n' -n1 sh -c 'mv -v "$1" "$(echo "$1" | sed "s/ *$//")"' --
前两行根据路径的深度以相反的顺序对路径进行排序。所以在get 重命名"./a /b "
为. 最后一个命令使用删除路径中的尾随空格,然后调用. 在tutorialspoint上对其进行了测试。"./a /b "
"./a "
"./a"
sed
mv
我认为我们可以xargs
通过使用 perl 的 rename 实用程序来简化该行(但它必须是 perls,而不是来自 util-linux 的那个):
.... |
xargs -d '\n' rename 's/ *$//'
好吧,我们可以rename ' ' ''
使用 util-linux 重命名,但这会删除所有空格,我们只想要尾随空格。
推荐阅读
- angular - Angular HttpClient 发布两个文件(Multipart/form-data)
- angular - 检查给定的 URL 是否存在于 Angular 2+
- javascript - 无法获取 Microsoft Graph API javascript ajax 调用的访问令牌
- ios - 当我点击播放器 API 到 Rounaz Cricket API 时,它会发回给我“AccessDenied”
- javascript - 开玩笑测试(使用 babel)无效的令牌导入
- javascript - Javascript对象数组重组
- jquery - Jquery - 按钮无法与类正确触发
- java - 如何从 .class 文件生成 C(本机)头文件(已编译)
- javascript - 当我向下滚动页面时,Particles.js 不会继续 - HTML
- python - pytorch,如何制作相同大小的张量模型(x)和答案(x)?