Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-04-16 08:23:35

  svL - Użytkownik

svL
Użytkownik
Zarejestrowany: 2007-06-17

zmiana nazw plików ze spacjami

Cześć, w katalogu znajdują się pliki o takiej samej nazwie różniące się wielkością liter. Pliki te są udostępnianie windowsowi i tutaj pojawia się problem. Chce do duplikatów dodać 0001 na końcu pliku.
Przeszukując internety skleciłem takie coś:

Kod:

for f in `ls * | sort -f | uniq -i -d`; do mv "$f" "${f%.pdf}.0001.pdf";done

Niestety większość plików zawiera spacje, przez co w wyniku dostaje:

mv: cannot stat `2': No such file or directory
mv: cannot stat `443': No such file or directory
mv: cannot stat `4334': No such file or directory
mv: cannot stat `x': No such file or directory
mv: cannot stat `444.pdf': No such file or directory

Są to fragmenty nazw plików pomiędzy spacjami, pliki bez spacji w nazwie zmieniają się bez problemów.
Jedyne rozwiązanie jaki udało mi się znaleźć to zmiana spacji na podkreślenie, jednak tego chce uniknąć (pliki są wczytywane w innych programach nie wiem jak się może zachować).
Macie jakiś pomysł jak sobie z tym poradzić?


"God, root, what is difference?"

Offline

 

#2  2013-04-16 08:51:46

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: zmiana nazw plików ze spacjami

Kod:

ls * | sort -f | uniq -i -d |while read filename; do 
   …
done

Offline

 

#3  2013-04-16 13:00:22

  svL - Użytkownik

svL
Użytkownik
Zarejestrowany: 2007-06-17

Re: zmiana nazw plików ze spacjami

Spróbowałem, ale w dostaję takie coś:

# for f in `ls * | sort -f | uniq -i -d |while read filename`; do mv "$f" "${f%.pdf}.0001.pdf";done
bash: command substitution: line 2: syntax error: unexpected end of file

Fragment zawartości katalogu:

# ls -l
total 0
-rw-r--r-- 1 root root 0 Apr 15 14:54 1.pdf
-rw-r--r-- 1 root root 0 Apr 15 10:47 1.PDF
-rw-r--r-- 1 root root 0 Apr 15 11:02 2 443 4334 x 444.pdf
-rw-r--r-- 1 root root 0 Apr 15 11:01 2 443 4334 X 444.pdf


"God, root, what is difference?"

Offline

 

#4  2013-04-16 16:14:29

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: zmiana nazw plików ze spacjami

svL napisał(-a):

Spróbowałem, ale w dostaję takie coś:

# for f in `ls * | sort -f | uniq -i -d |while read filename`; do mv "$f" "${f%.pdf}.0001.pdf";done
bash: command substitution: line 2: syntax error: unexpected end of file

Wróć.

Zamiast pętli for, która oddziela kolejne elementy po zawartości zmiennej IFS (w tym spacjach), masz użyć pętli while. Ona oddziela elementy po znaku nowej linii¹ (co oznacza że wyłoży się na plikach ze znakiem nowej linii w nazwie, ale Windows też by się na nich wyłożył, więc prawdopodobnie takich nie masz).
Gotowe polecenie wygląda tak:

Kod:

ls * | sort -f | uniq -i -d |while read filename ; do
   mv "$filename" "${filename%.pdf}.0001.pdf"
done

----
1. read przyjmuje argument, dzięki któremu będzie czytał standardowe wejście do wystąpienia NUL. „Symbol” ten nie jest dozwolony w nazwach bodaj żadnego istniejącego systemu plików. W ten sposób można stworzyć pętlę odporną nawet na znak nowej linii w nazwach plików. Ale to pozostawiam już dla purystów.

Ostatnio edytowany przez Minio (2013-04-16 21:58:33)

Offline

 

#5  2013-04-17 09:31:43

  svL - Użytkownik

svL
Użytkownik
Zarejestrowany: 2007-06-17

Re: zmiana nazw plików ze spacjami

Minio dziękuję Ci bardzo za pomoc, wszystko działa.


"God, root, what is difference?"

Offline

 

#6  2013-04-17 19:53:30

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: zmiana nazw plików ze spacjami

Minio dzięki za naukę z tym read. W wielu skryptach miałem z tym problem, a teraz mam rozwiązanie na tacy :)


http://img34.imageshack.us/img34/5092/zw9m.png http://img29.imageshack.us/img29/219/pibw.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)