Мне нужно переименовать несколько файлов в каталоге, удалив первые 5 символов для каждого имени файла.
Как я могу это сделать в bash / shell? Я использую Ubuntu 11.10. Спасибо.
Простой цикл for с небольшим количеством sed
сделает свое дело:
% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r-- 1 jamesog wheel 0 29 Dec 18:07 xxxxxbar
-rw-r--r-- 1 jamesog wheel 0 29 Dec 18:07 xxxxxbaz
-rw-r--r-- 1 jamesog wheel 0 29 Dec 18:07 xxxxxfoo
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r-- 1 jamesog wheel 0 29 Dec 18:07 bar
-rw-r--r-- 1 jamesog wheel 0 29 Dec 18:07 baz
-rw-r--r-- 1 jamesog wheel 0 29 Dec 18:07 foo
Заменитель регулярное выражение в sed
говорит, что соответствует любым пяти символам (.
означает любой символ) в начале строки (^
) и удалите его.
Bash имеет несколько удивительных возможностей создания сценариев. Вот один из способов:
for file in ??????*; do mv $file `echo $file | cut -c6-`; done
Удобный способ проверить, что это бы do - это добавить эхо перед командой:
for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done
Шесть вопросительных знаков гарантируют, что вы попытаетесь сделать это только с именами файлов длиной более 5 символов.
Вы можете использовать sed для этого
for file in * ; do mv $file $(echo $file |sed 's/^.\{5\}//g'); done
Всем отличных ответов, спасибо. Вот что сработало в моем случае:
rename 's/^.......//g' *
Мои два цента':
for file in *; do mv $file ${file:5}; done
${file:n}
убирает первый n
символы в строке file
.