我想在Bash中编写一个脚本:
将文件作为输入。
如果文件名有空格,则用下划线更改。
我的第一个问题是:一个Bash脚本可以将参数作为输入,或者一旦脚本通过read命令运行就必须提供任何输入吗?另一个问题是如何使用mv
命令执行第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
$