我想击即编写一个脚本:更改为下划线的空格中的Bash
接受文件作为输入。
如果文件名有任何空格,它会用下划线改变它。
我的第一个问题是:一个bash脚本采用参数为输入或输入任何必须要提供一次脚本读取指令的方式运行?另一个问题是如何使用mv
命令执行2点
我想击即编写一个脚本:更改为下划线的空格中的Bash
接受文件作为输入。
如果文件名有任何空格,它会用下划线改变它。
我的第一个问题是:一个bash脚本采用参数为输入或输入任何必须要提供一次脚本读取指令的方式运行?另一个问题是如何使用mv
命令执行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:]]
而不是。
是的,当然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
$
你不需要'xargs':'find。 -maxdepth 1 -type f -name'* *'-execdir bash -c'mv“$ 0”“$ {0 ///_}”'{} \;'。 (也使用'bash',因为我的'sh'不支持这种扩展)。 – 2014-10-28 13:21:13
@gniourf_gniourf:是的,我这样做,因为-execdir是一个GNU扩展,并且无处不在,所以为了安全起见(OP没有提及它们运行的是什么操作系统)我决定去找xargs :) - 感谢指点这是一个有效的观点。 – galaxy 2014-10-28 13:23:10
'-execdir' _不是GNU扩展_(你不是第一个声称这个......你是从哪里得到这个的?)。无论如何,'-exec'也会完成这项工作。 – 2014-10-28 13:26:45
请使用Bash! 'mv“$ 1”“$ {1 // [[:space:]]/_}”'。不需要为此调用'sed'。 – 2014-10-28 13:13:15
@gniourf_gniourf让你的评论一个答案,所以我可以upvote它:) – RedX 2014-10-28 13:14:24
否:_you_解决你的答案,我会upvote它! – 2014-10-28 13:14:50