结构
/some/dir/a b c d /somedir2/somedir4
/some/dir/abcderf/somedir123/somedir22
问题
需要递归删除目录中的结尾空格,在示例中,“ a b c d
”的末尾有一个空格,而“ somedir22
”的末尾可能有一个空白,需要删除。
有数百个目录,并且希望递归地迭代每个目录,以检查该目录是否具有尾随空格,如果是,则重命名没有空格的目录。目前Bash是我唯一的选择,因为它正在Western Digital NAS上运行。
答案 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重命名,但这将删除所有空格,我们只希望结尾空格。