Установка

Установка

Полный новичок, пытаюсь написать код для удаления первого пробела из пакета имен файлов.

Когда я набираю в терминале:

#!/bin/bash

for f in *.jpg; do echo mv "$f" “${f/ /}”; done

Я получил:

mv R 1  Pe.jpg “R1 Pe.jpg”
mv R 10 Ma.jpg “R10 Ma.jpg”
mv R 11 An.jpg “R11 An.jpg”

Но когда я удаляю echo, фактического переименования не происходит, я получаю эту ошибку:

for f in *.jpg; do mv "$f" “${f/ /}”; done
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Какие-либо предложения?

решение1

Это не цитаты. Вы не ":

$ uniprops “
U+201C ‹“› \N{LEFT DOUBLE QUOTATION MARK}
    \pP \p{Pi}
    All Any Assigned Punct Is_Punctuation Common Zyyy Pi P General_Punctuation
       InPunctuation Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase
       Initial_Punctuation Pat_Syn Pattern_Syntax PatSyn Print X_POSIX_Print
       Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct


$ uniprops '"'
U+0022 ‹"› \N{QUOTATION MARK}
    \pP \p{Po}
    All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
       X_POSIX_Print Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct

Поскольку кавычки в именах целей не являются правильными двойными кавычками, второй аргумент будет разделен пробелами, а первая mvкоманда попытается переместить два файла R 1 Pe.jpgи “R1в несуществующий каталог Pe.jpg”. Это и вызывает ошибки.

Итак, попробуйте это:

for f in *.jpg; do echo mv "$f" "${f/ /}"; done

решение2

Да, это проблема цитирования (см. другие ответы).

Однако для этой конкретной проблемы лучше использовать команду rename(команду Ларри Уолла).

например

rename -n -e "s/ //" *.jpg

После тестирования и проверки вывода удалите -n.

Установка

В Debian с apt install rename.

решение3

Да, кавычки — это проблема. Команда echo выглядит так:
mv R 1 Pe.jpg “R1 Pe.jpg”
Если бы вы ввели это в командную строку, она бы не сработала, потому что пробелы в исходном коде не заключены в кавычки и не экранированы. Правильная команда была бы такой:
mv "R 1 Pe.jpg" "R1 Pe.jpg"
Чтобы поместить символы quit вокруг переменной $f, я бы предложил что-то вроде этого:
mv "\""$f"\"" "${f/ /}"
где "\"" — это экранирующий код для вывода двойной кавычки.
А именно: echo " n " отображает n. echo " \n " экранирует n и показывает новую строку. Аналогично echo " \" "экранирует кавычку внутри кавычек.
Другой вариант мог бы быть таким:
mv '"'$f'"' "${f/ /}"

Связанный контент