当前位置:  开发笔记 > 编程语言 > 正文

如何使用bash脚本替换文件名中的空格

如何解决《如何使用bash脚本替换文件名中的空格》经验,为你挑选了7个好方法。

任何人都可以推荐一个安全的解决方案,从给定的根目录开始递归地用文件和目录名称中的下划线替换空格?例如:

$ tree
.
|-- a dir
|   `-- file with spaces.txt
`-- b dir
    |-- another file with spaces.txt
    `-- yet another file with spaces.pdf

变为:

$ tree
.
|-- a_dir
|   `-- file_with_spaces.txt
`-- b_dir
    |-- another_file_with_spaces.txt
    `-- yet_another_file_with_spaces.pdf

Naidim.. 326

我用:

for f in *\ *; do mv "$f" "${f// /_}"; done

虽然它不是递归的,但却非常快速和简单.我相信这里有人可以将它更新为递归.

"$ {f ///_}"部分利用bash的参数扩展机制,用提供的字符串替换参数中的模式.相关语法是"$ {parameter/pattern/string}".请参阅:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html或http://wiki.bash-hackers.org/syntax/pe.



1> Naidim..:

我用:

for f in *\ *; do mv "$f" "${f// /_}"; done

虽然它不是递归的,但却非常快速和简单.我相信这里有人可以将它更新为递归.

"$ {f ///_}"部分利用bash的参数扩展机制,用提供的字符串替换参数中的模式.相关语法是"$ {parameter/pattern/string}".请参阅:https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html或http://wiki.bash-hackers.org/syntax/pe.


简单,在mac中工作.(mac没有'重命名`,而且很难用brew安装它......)
很棒的答案.我在*\*中使用`for d 做mv"$ d""$ {d // /}"; 完成了非得分.
非常好,在Windows下使用Git Bash
只有一个对我有用.有一个upvote!
有人可以解释这部分为何起作用:$ {f // / _}

2> Paused until..:

使用rename(又名prename)Perl脚本,它可能已经在您的系统上.分两步完成:

find -name "* *" -type d | rename 's/ /_/g'    # do the directories first
find -name "* *" -type f | rename 's/ /_/g'

根据于尔根的答案,并能处理文件和目录的多层纵身使用的"修订版1.5 1998年12月18日16时16分31秒1元"的版本/usr/bin/rename(Perl脚本):

find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;


如果你在OS X上运行它,你需要`brew install rename`
这在Centos 7上不起作用,因为rename命令完全不同(它是二进制文件,而不是perl脚本),并且它不接受来自stdin的数据.
无需两个步骤:使用深度优先搜索:find dir -depth
哦,我刚刚阅读了`rename`联机帮助页(我不知道该工具),我认为你可以通过将`s// _/g`更改为`y// _ /`;-)来优化代码

3> Michael Krel..:
find . -depth -name '* *' \
| while IFS= read -r f ; do mv -i "$f" "$(dirname "$f")/$(basename "$f"|tr ' ' _)" ; done

一开始没能把它弄好,因为我没有想到目录.


这必须是我第50次访问此页面以复制和使用您的解决方案.非常感谢你**.我更喜欢你的答案,因为我在Mac上并且没有丹尼斯提出的"重命名"命令.

4> 小智..:

你可以使用detoxDoug Harple

detox -r 


太棒了-谢谢Doug Harple!

5> Jürgen Hötze..:

一个查找/重命名的解决方案.rename是util-linux的一部分.

您需要先降低深度,因为空白文件名可以是空白目录的一部分:

find /tmp/ -depth -name "* *" -execdir rename " " "_" "{}" ";"



6> ghostdog74..:

bash 4.0

#!/bin/bash
shopt -s globstar
for file in **/*\ *
do 
    mv "$file" "${file// /_}"       
done



7> 小智..:

你可以用这个:

    find . -name '* *' | while read fname 

do
        new_fname=`echo $fname | tr " " "_"`

        if [ -e $new_fname ]
        then
                echo "File $new_fname already exists. Not replacing $fname"
        else
                echo "Creating new file $new_fname to replace $fname"
                mv "$fname" $new_fname
        fi
done

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有