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

问题描述 投票:1回答:1

结构体

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

问题需要以递归方式删除目录中的尾部空格,例如“a b c d”末尾有一个空格,“somedir22”的末尾可能有一个需要删除的空格。

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

bash ls
1个回答
3
投票

我认为最糟糕的是,每次你在mv目录时,该目录中的目录都会改变路径。

所以我们需要让find处理目录本身之前的每个子目录。感谢@thatotherguy为-depth选项需要传递给find。有了一些奇特的-exec sh脚本,我们可以只用find所有以尾随空格结尾的目录并在目录本身之前处理每个目录的conetnt。对于每个目录,运行一个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/ *$//")"' --

前两行根据路径的深度以相反的顺序排序路径。因此,在"./a /b "重新命名为"./a /b "之前,"./a "更名为"./a"。最后一个命令使用sed从路径中删除尾随空格,然后调用mv。在tutorialspoint上测试过。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.