Fi sh: бутч переименовывает файлы с пробелами в именах, используя mv и sed - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь переименовать несколько файлов из командной строки следующим образом:

for f in *.pdf
    mv $f echo $f | sed 's/\( \)\([0-9]\)/-\2/'
end

Я получил ошибку:

mv: target 'filename' is not a directory

Очевидно, что имя цели имеет пробелы и должны быть заключены в кавычки для обработки командой mv.

Что мне делать, чтобы этот скрипт работал?

1 Ответ

1 голос
/ 18 июня 2020

Ваш сценарий попытается переместить файл и файл с именем «echo» в файл и направить вывод mv в sed.

Все, что вам нужно, - это запустить этот echo | sed в подстановке команд, которую fi sh обозначает ():

for f in *.pdf
    mv $f (echo $f | sed 's/\( \)\([0-9]\)/-\2/')
end

Очевидно, что имя цели имеет пробелы и должно быть заключено в кавычки, чтобы его можно было обработать командой mv.

Это не очевидно, потому что не нужно цитировать. Fi sh не выполняет разбиение слов, как bash. Имя файла задается один раз, и тогда $f всегда будет давать имя файла в качестве одного аргумента.

Цитирование как "$f" было бы совершенно излишним.

При подстановке команд он разделяет их только для новой строки , а не пробелов, поэтому, если у вас нет имени файла с новой строкой ( очень маловероятно), у вас тоже не будет проблем.

Если вы нужно ли было использовать string collect как

for f in *.pdf
    mv $f (echo $f | sed 's/\( \)\([0-9]\)/-\2/' | string collect)
end

, чтобы подстановка команды приводила к одному аргументу.

...