在Bash中使用下划线更改空格

时间:2014-10-28 12:57:34

标签: bash

我想在Bash中编写一个脚本:

  1. 将文件作为输入。

  2. 如果文件名有空格,则用下划线更改。

  3. 我的第一个问题是:一个Bash脚本可以将参数作为输入,或者一旦脚本通过read命令运行就必须提供任何输入吗?另一个问题是如何使用mv命令执行第2点。

2 个答案:

答案 0 :(得分:2)

您的脚本可能只是:

#!/bin/bash

mv "$1" "$(sed 's/ \{1,\}/_/g' <<<"$1")"

script.sh file\ name一样使用它。文件file name将重命名为file_name

正如gniourf_gniourf已在评论中指出(感谢),如果您使用bash,也可以使用内置字符替换:

mv "$1" "${1// /_}"

这种行为略有不同,因为它将用下划线替换每个单独的空间,而使用sed的方法也会将空格组压缩成单个下划线。如果启用扩展通配符,则可以使此版本与使用sed:

的版本相同
shopt -s extglob
mv "$1" "${1//+( )/_}"

根据您是要查找空格字符还是所有类型的空格(如标签,换行符等),您可能需要使用[[:space:]]而不是{{1}在每个例子中都有。

答案 1 :(得分:2)

是的,当然bash脚本可以提供参数。我建议至少阅读bash手册(man bash),它会回答你的大部分问题。

Re:您的实际任务 - 了解您的操作系统真的很有帮助。如果您在* nix上运行此操作,则以下内容将解决您的问题:

$ touch "example file 1" "example  file  2"
$ ls -ld example*
-rw------- 1 user group 0 Oct 29 00:06 example  file  2
-rw------- 1 user group 0 Oct 29 00:06 example file 1
$ find . -maxdepth 1 -type f -name '* *' -print0 | xargs -0i /bin/bash -c 'F="{}" ; mv -iv "$F" "${F//[[:space:]]/_}"'
'./example  file  2' -> './example__file__2'
'./example file 1' -> './example_file_1'
$ ls -ld example*
-rw------- 1 user group 0 Oct 29 00:06 example__file__2
-rw------- 1 user group 0 Oct 29 00:06 example_file_1
$