Mam zestaw skryptów, których używam do pobierania plików przez FTP, a następnie usuwania ich z serwera.Bash - Wykonywanie poleceń SSH
Działa on następująco:
for dir in `ls /volume1/auto_downloads/sync-complete`
do
if [ "x$dir" != *"x"* ]
then
echo "DIR: $dir"
echo "Moving out of complete"
# Soft delete from server so they don't get downloaded again
ssh [email protected] mv -v "'/home/dan/Downloads/complete/$dir'" /home/dan/Downloads/downloaded
Teraz $ dir może być "Plik", który działa dobrze.
Problem mam jest ze znaków specjalnych np:
- "Jest to (a) plik"
- Ten plik jest & rzeczy”
tendencję do błędu:
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `mv -v '/home/dan/Downloads/complete/This is (a) file' /home/dan/Downloads/downloaded'
Nie mogę wymyślić, jak uciec, aby obie zmienne zostały ocenione i komenda trafia właściwie. Próbowałem różnych kombinacji znaków ewakuacyjnych, dosłowne cytaty, cytaty itp normalne
Jak o 'rsync --remove-source-files' http://serverfault.com/a/363925/69736 . Dużo łatwiej! –
Nie jest jasne, w jaki sposób 'dir' jest ustawiony na pojedynczy ciąg 'This is (a) file'. Powinien być ustawiony kolejno na 4 oddzielne ciągi: "To", "jest", "(a)" i "plik". Nie parsuj wyniku polecenia 'ls'; przełącz katalog i iteruj na glob (zobacz moją odpowiedź dla szczegółów). – chepner