递归删除目录中的尾随空格

Recursive removal of trailing whitespace in directory

结构

/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 提供需要传递给 find-depth 选项。使用一些花哨的 -exec sh 脚本,我们可以 find 所有以尾随 space 结尾的目录,并在目录本身之前处理每个目录的 conetnt。对于每个目录,运行 一个 shell 脚本,它删除尾随的 spaces 和 mvs 目录:

find . -type d -regex '.* ' -depth \
    -exec sh -c 'mv -v "" "$(echo "" | 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 "" "$(echo "" | sed "s/ *$//")"' --

前两行根据路径的深度对路径进行倒序排序。因此 "./a /b ""./a " 重命名为 "./a" 之前重命名为 "./a /b "。最后一个命令使用 sed 从路径中删除尾随 space,然后调用 mv。在 tutorialspoint.

上进行了测试

我认为我们可以使用 perl 的重命名实用程序使 xargs 行更简单(但它必须是 perls,而不是来自 util-linux 的那个):

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

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