Viren
Viren

Reputation: 2171

awk, sed: one liner command for removing spaces from _all_ file names in a given folder?

Before:

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

After:

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

Tried below prototype, but it does not work :( Sorry, not very good when it comes to awk/sed :(

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

[ Above is prototype, real command, I guess, would be:

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

]

Upvotes: 8

Views: 9569

Answers (2)

William Pursell
William Pursell

Reputation: 212514

ghoti's solution is the right thing to do. Since you ask how to do it in sed, here's one way:

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

The tr is there to remove newlines in the filename, and is necessary to ensure that sed sees the entire filename in one line.

Upvotes: 7

ghoti
ghoti

Reputation: 46876

No need to use awk or sed when you can do this in pure bash.

[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]$ 

Note that the ${foo/ /} notation is bash, and does not work in classic Bourne shell.

Upvotes: 18

Related Questions