2012-08-01 10 views
6

前:awk、sed:指定されたフォルダ内の_all_ファイル名からスペースを削除するための1つのlinerコマンド?

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' 

+3

[Parsing ls problem](http://mywiki.wooledge.org/ParsingLs)に悩まされています。シェルがサポートしている場合は、ghotiの解を代わりに使用してください。 – Graham

+0

@Graham:私はParsingの問題を認識していませんでした。リンクは非常に便利でした。お返事ありがとう – Viren

答えて

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を確保する必要がある1行にファイル名全体を見ています。

15

純粋なbashでこれを実行できるときは、awkまたはsedを使用する必要はありません。 ${foo/ /}表記はbashのであり、古典的なBourneシェルに動作しないこと

[[email protected] ~/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 
[[email protected] ~/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 
[[email protected] ~/tmp1]$ 

注意。

+0

ありがとうございます。私はこれが正しい方法だと理解していますが、この質問をする意思は私の個人学習のためのものであり、生産システムの一部ではありません。私はPursellさんの答えを受け入れています。 – Viren

関連する問題