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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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ś:
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ć?
Offline
ls * | sort -f | uniq -i -d |while read filename; do … done
Offline
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
Offline
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:
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
Minio dziękuję Ci bardzo za pomoc, wszystko działa.
Offline
Minio dzięki za naukę z tym read. W wielu skryptach miałem z tym problem, a teraz mam rozwiązanie na tacy :)
Offline