检测并删除文件或文件夹名称中的前导 space
Detect & remove leading space in file or folder name
我需要检测并删除文件夹和文件中的许多前导 space。
我尝试了一些代码,例如:
find /home/account -depth -name " *" -exec sh -c 'f="{}"; mv -v "$f" "...."' \;
但我找不到任何代码来从文件名或文件夹中删除前导 space。
我需要:
mv "/home/account/folder/ folder 1" "/home/account/folder/folder 1"
(因为我使用查找,并让它检测子文件夹中的前导 space)
我如何使用上面提到的代码删除那些领先的 space?
任何建议都会有所帮助。
顺便说一句,我正在使用 centos 7.
试试这个:
find /home/account -depth -name "* " | sed "s/\/ /\//g"
-name "* "
匹配名称中有 trailing space 的文件名。我在下面修复了这个问题,并使用 -execdir
使使用参数扩展更容易删除前导 space。
find /home/account -depth -name ' *' -execdir sh -c '
for f; do
mv -v "$f" "${f#./[[:space:]]}"
done' _ {} +
对于干燥-运行 在 mv
之前加上 echo
。
如果可能有多个前导 space,那么方便的方法是在参数扩展中使用 extglob(这是一个 bash 扩展):
find /home/account -depth -name ' *' -execdir bash -c '
shopt -s extglob
for f; do
mv -v "$f" "${f#./+([[:space:]])}"
done' _ {} +
您可以使用bash替换来提取文件名,并删除前导spaces。
小提示:模式 -name "* "
查找尾随 space(s) 的文件。如果您正在寻找前导 space(s) 的过滤器,请使用 -name " *"
,或寻找任何 space 而不是 -name "* * "
的过滤器。示例代码使用前导 space 模式。您可以根据需要调整 pattern 和 sed。
find /home/account -depth -name " *" | while read fn ; do
d=${fn%/*}
b=$(echo "${fn##*/}" | sed -e 's/^ *//')
mv "$fn" "$d/$b"
done
使用rename
- -name "* " :匹配名称中有尾随 space 的文件名
- 重命名 's/ //gi' : 将 space 替换为空
-->
find /home/account -depth -name "* " | rename 's/ //gi'
我需要检测并删除文件夹和文件中的许多前导 space。
我尝试了一些代码,例如:
find /home/account -depth -name " *" -exec sh -c 'f="{}"; mv -v "$f" "...."' \;
但我找不到任何代码来从文件名或文件夹中删除前导 space。
我需要:
mv "/home/account/folder/ folder 1" "/home/account/folder/folder 1"
(因为我使用查找,并让它检测子文件夹中的前导 space)
我如何使用上面提到的代码删除那些领先的 space? 任何建议都会有所帮助。 顺便说一句,我正在使用 centos 7.
试试这个:
find /home/account -depth -name "* " | sed "s/\/ /\//g"
-name "* "
匹配名称中有 trailing space 的文件名。我在下面修复了这个问题,并使用 -execdir
使使用参数扩展更容易删除前导 space。
find /home/account -depth -name ' *' -execdir sh -c '
for f; do
mv -v "$f" "${f#./[[:space:]]}"
done' _ {} +
对于干燥-运行 在 mv
之前加上 echo
。
如果可能有多个前导 space,那么方便的方法是在参数扩展中使用 extglob(这是一个 bash 扩展):
find /home/account -depth -name ' *' -execdir bash -c '
shopt -s extglob
for f; do
mv -v "$f" "${f#./+([[:space:]])}"
done' _ {} +
您可以使用bash替换来提取文件名,并删除前导spaces。
小提示:模式 -name "* "
查找尾随 space(s) 的文件。如果您正在寻找前导 space(s) 的过滤器,请使用 -name " *"
,或寻找任何 space 而不是 -name "* * "
的过滤器。示例代码使用前导 space 模式。您可以根据需要调整 pattern 和 sed。
find /home/account -depth -name " *" | while read fn ; do
d=${fn%/*}
b=$(echo "${fn##*/}" | sed -e 's/^ *//')
mv "$fn" "$d/$b"
done
使用rename
- -name "* " :匹配名称中有尾随 space 的文件名
- 重命名 's/ //gi' : 将 space 替换为空
-->
find /home/account -depth -name "* " | rename 's/ //gi'