sed
решение. Ищет дефис, за которым следуют 3 символа, за которыми следует.mp4, за которым следует конец строки ($ ), и ничего не заменяет.
Прочитать "file", записать более короткие имена в файл "newfile".
sed 's/-...\.mp4$//g' file >newfile
или отредактируйте «файл» на месте
sed -i 's/-...\.mp4$//g' file
*
— это оператор оболочки оболочки. Его нужно оставить без кавычек, чтобы его признали таковым. В кавычках /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, такие как *(.)
, для перемещения только обычных файлов