首页 > 解决方案 > 递归删除目录中的尾随空格

问题描述

结构

/some/dir/a b c d /somedir2/somedir4
/some/dir/abcderf/somedir123/somedir22 

问题 需要递归删除目录中的尾随空格,在示例中,“ a b c d”末尾有一个空格,“ somedir22”末尾可能有一个空格,需要删除。

有数百个目录,并且希望递归地迭代每个目录以检查目录是否有尾随空格,如果有,则重命名不带空格的目录。Bash 是我目前唯一的选择,因为它在 Western Digital NAS 上运行。

标签: bashls

解决方案


我认为最糟糕的是,每次您mv创建一个目录时,该目录中的目录都会更改路径。

所以我们需要find在目录本身之前处理每个子目录。感谢@thatotherguy 提供-depth需要传递给find. 使用一些花哨-exec的 sh 脚本,我们可以只find处理所有以尾随空格结尾的目录,并在目录本身之前处理每个目录的内容。对于每个目录,运行一个 shell 脚本,它会删除尾随空格并mvs 目录:

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"sedmv

我认为我们可以xargs通过使用 perl 的 rename 实用程序来简化该行(但它必须是 perls,而不是来自 util-linux 的那个):

.... |
xargs -d '\n' rename 's/ *$//'

好吧,我们可以rename ' ' ''使用 util-linux 重命名,但这会删除所有空格,我们只想要尾随空格。


推荐阅读