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

时间:2019-02-26 19:41:23

标签: bash ls

结构

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

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

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

1 个答案:

答案 0 :(得分:3)

我认为最糟糕的是,每当您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/ *$//")"' --

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

我认为我们可以使用perl的重命名实用工具简化xargs行(但它必须是perls,而不是util-linux中的那个):

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

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