8

前:

eng-vshakya:scripts vshakya$ ls
American Samoa.png                  Faroe Islands.png                   Saint Barthelemy.png

后:

eng-vshakya:scripts vshakya$ ls
AmericanSamoa.png                   FaroeIslands.png                    SaintBarthelemy.png

在原型下面尝试过,但它不起作用 :( 抱歉,在 awk/sed 方面不是很好 :(

ls *.png | sed 's/\ /\\\ /g' | awk '{print("mv "$1" "$1)}'

[以上是原型,我猜真正的命令是:

ls *.png | sed 's/\ /\\\ /g' | awk '{print("mv "$1" "$1)}' | sed 's/\ //g'

]

4

2 回答 2

18

当您可以在纯 bash 中执行此操作时,无需使用 awk 或 sed。

[ghoti@pc ~/tmp1]$ ls -l
total 2
-rw-r--r--  1 ghoti  wheel  0 Aug  1 01:19 American Samoa.png
-rw-r--r--  1 ghoti  wheel  0 Aug  1 01:19 Faroe Islands.png
-rw-r--r--  1 ghoti  wheel  0 Aug  1 01:19 Saint Barthelemy.png
[ghoti@pc ~/tmp1]$ for name in *\ *; do mv -v "$name" "${name// /}"; done
American Samoa.png -> AmericanSamoa.png
Faroe Islands.png -> FaroeIslands.png
Saint Barthelemy.png -> SaintBarthelemy.png
[ghoti@pc ~/tmp1]$ 

请注意,${foo/ /}符号是bash,并且在经典的 Bourne shell 中不起作用。

于 2012-08-01T05:20:53.390 回答
7

ghoti 的解决方案是正确的做法。既然你问如何在 sed 中做到这一点,这里有一种方法:

for file in *; do newfile=$( echo "$file" | tr -d \\n | sed 's/ //g' );
   test "$file" != "$newfile" && mv "$file" "$newfile"; done

用于删除文件名中的tr换行符,并且有必要确保 sed 在一行中看到整个文件名。

于 2012-08-01T12:37:59.427 回答