我想删除文件夹名称末尾的空格。
我有一个名为“Project1”的文件夹,其中有另一个名为“Exercise1”的文件夹。
我想用一个脚本来删除末尾的空格,并且只删除末尾的空格。
我不知道我的表达是否正确。
预先感谢您,祝您度过一个愉快的夜晚。
我输入了命令/bin/ls -l | od -c
root@debian:~$ /bin/ls -l | od -c
0000000 t o t a l 3 2 \n d r w x r - x
0000020 r - x 2 k a b i a k a b i
0000040 a 4 0 9 6 j u i l . 2 0
0000060 1 0 : 2 6 B u r e a u \n d r w
0000100 x r - x r - x 7 k a b i a
0000120 k a b i a 4 0 9 6 j u i l .
0000140 2 2 1 7 : 4 6 D o c u m e
0000160 n t s \n d r w x r - x r - x 2
0000200 k a b i a k a b i a 4 0 9
0000220 6 j u i l . 2 2 1 9 : 2 6
0000240 I m a g e s \n d r w x r - x r
0000260 - x 2 k a b i a k a b i a
0000300 4 0 9 6 j u i l . 2 0 1
0000320 0 : 2 6 M o d 303 250 l e s \n d r
0000340 w x r - x r - x 2 k a b i a
0000360 k a b i a 4 0 9 6 j u i l
0000400 . 2 0 1 0 : 2 6 M u s i q
0000420 u e \n d r w x r - x r - x 2
0000440 k a b i a k a b i a 4 0 9 6
0000460 j u i l . 2 0 1 0 : 2 6
0000500 P u b l i c \n d r w x r - x r -
0000520 x 2 k a b i a k a b i a
0000540 4 0 9 6 j u i l . 2 0 1 0
0000560 : 2 6 T 303 251 l 303 251 c h a r g e
0000600 m e n t s \n d r w x r - x r - x
0000620 2 k a b i a k a b i a 4
0000640 0 9 6 j u i l . 2 0 1 0 :
0000660 2 6 V i d 303 251 o s \n
0000673
答案1
和zsh
:
autoload zmv # best in ~/.zshrc
zmv -n '**/*[[:space:]]' '${f%%[[:space:]]#}'
(高兴时移除-n
以进行空运行)
将从每个非隐藏文件或目录的末尾删除尾随空白字符。(#q/)
如果您只想限制为目录,请添加到模式参数。或者(#qD)
也处理隐藏文件。
POSIXly,你可以做一些接近的事情:
LC_ALL=C find . -depth -name '*[[:space:]]' -exec sh -x -c '
for f do
: mv -i "$f" "${f%"${f##*[![:space:]]}"}"
done' sh {} +
-x
(当高兴时删除:
)。
该字符仅限于 ASCII 空白字符。
答案2
您可以使用 Bash 脚本来执行此操作。
只需创建一个脚本并将此代码复制到其中,将其放在“错误命名目录”所在的顶级目录中,然后执行:
#!/bin/bash
# find all directory names that end with space:
while find "$(pwd)" -type d |grep -q ' $'
do
# select one and store its name in DIR variable
DIR=$(find "$(pwd)" -type d | grep ' $'|head -1)
# remove the last character (which is space) from that
# name and save it to NEW_DIR variable
NEW_DIR=${DIR%?}
# rename the directory
mv "$DIR" "$NEW_DIR"
done
正如您在此屏幕截图中所看到的,“”中存在具有类似条件的目录测试2”目录下,名为“space.sh”的脚本也位于“测试2”。执行脚本后,目录已根据我们的需要重命名:
答案3
该pathlib
模块在蟒蛇3 拥有遍历层次结构、检测所述文件并重命名它们的所有必要手段。
python3 -c 'import pathlib
for p in iter(pathlib.Path(".").rglob("*[ \t]")):
p.rename("/".join([str(p.parent),p.name.rstrip()]))'
根据文件层次结构中存在的文件名类型,我们使用以下 python 代码来递归遍历树深度优先是默认操作。它查找任何非 ASCII 名称并通过替换非 ASCII 字符来重命名。带有“X”。重命名之前不会检查新名称是否已存在。
python3 - <<\eof
import pathlib, re
for p in iter(pathlib.Path('.').rglob('*[! -~]*')):
foo = p.name
for m in re.finditer(r"[^ -~]",p.name):
foo = foo[:m.start()] + "X" + foo[m.end():]
p.rename("/".join([str(p.parent),foo]))
eof
答案4
使用珀尔的rename
。
我没有写这个,但我经常使用它。将视频文件从 Windows 机器传输到我的 Linux 机器会在目录名称末尾添加额外的空格,此命令会删除它们,无论是文件夹和文件名末尾的单个空格还是多个空格。
删除当前目录中目录/文件名末尾的空格
进行试运行
rename -n 's/ *$//' ./*
实际运行
rename 's/ *$//' ./*