Перемещение файлов с помощью " и *вызвало ошибку

sedрешение. Ищет дефис, за которым следуют 3 символа, за которыми следует.mp4, за которым следует конец строки ($ ), и ничего не заменяет.

Прочитать "file", записать более короткие имена в файл "newfile".

sed 's/-...\.mp4$//g' file >newfile

или отредактируйте «файл» на месте

sed -i 's/-...\.mp4$//g' file
1
22.08.2020, 22:21
1 ответ

*— это оператор оболочки оболочки. Его нужно оставить без кавычек, чтобы его признали таковым. В кавычках /media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/*буквально передается mv, а mvпытается переместить этот файл с именем *, но такого файла нет.

Значит нужно:

mv -v -- "$jdir0"/* "$jdir0/subs/" >> "$debuglog" 2>&1

Чтобы оболочка расширяла "$jdir0"/*в список соответствующих файлов перед вызовом mv.

Вы не хотите nullglobздесь, поскольку это будет означать, что при отсутствии файлов, соответствующих шаблону "$jdir0"/*, mvбудет вызываться только с -v, --и media/sf_Mediaserver3/test22/abbamax.(6th.copy)..kansas.(1999)/subs/вызывает запутанную синтаксическую ошибку mv.

failglobпрервать команду, когда глобусы не совпадают, может быть лучшим вариантом в этом случае, хотя обратите внимание, что bashпрерывает непоследовательным образом в этом случае в зависимости от контекста, в котором вызывается команда, что делает этот вариант сложным для использования в скриптах.

dotglob— разрешить глобусам сопоставлять скрытые файлы.

Теперь обратите внимание, что подстановочные знаки соответствуют файлам независимо от их типа¹, так что *выше также будет соответствовать subs. Если subsявляется символической ссылкой на каталог, mvс радостью переместит эту символическую ссылку subsв этот каталог, что приведет к сбою всех последующих перемещений, поскольку целевой каталог subsбольше не существует. Если subsявляется обычным подкаталогом, mv, вероятно, будет жаловаться, что не может переместить каталог в себя.

Так что вы можете вместо этого написать:

shopt -s extglob
mv -v -- "$jdir0"/!(subs) "$jdir0/subs/" >> "$debuglog" 2>&1

Где !(pattern)— расширенный оператор glob ksh, который соответствует любому имени файла, для которого не соответствует pattern, поэтому здесь перемещается любой файл, кроме subs.

Также обратите внимание, что в оболочке bashрасширения параметров также необходимо заключать в кавычки, когда они являются целями перенаправления, даже в не -интерактивных экземплярах оболочки (, за исключением случаев, когда bash находится в режиме POSIX ).


¹ если только вы не используете zsh вместо bash и его квалификаторы glob, такие как *(.), для перемещения только обычных файлов

7
18.03.2021, 23:10

Теги

Похожие вопросы