我想擊即編寫一個腳本:更改爲下劃線的空格中的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