Как переименовать несколько файлов, удалив символы в bash?


10

Я должен переименовать несколько файлов в каталоге, удалив первые 5 символов для каждого имени файла.
Как я могу сделать это, я Bash / Shell? Я использую Ubuntu 11.10. Спасибо.

Ответы:


11

Простой цикл 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говорит , чтобы соответствовать любые пять символов ( .любые символы) в начале строки ( ^) и удалить его.


9

У Bash есть несколько удивительных возможностей написания скриптов. Вот один из способов:

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

Удобный способ проверить, что он будет делать, - добавить эхо перед командой:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

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


5

Вы можете использовать sed, чтобы сделать это

for file in * ; do mv $file  $(echo $file |sed 's/^.\{5\}//g'); done

5

Все отличные ответы, спасибо. Вот что сработало в моем случае:

rename 's/^.......//g' *

1

Мои два цента':

for file in *; do mv $file ${file:5}; done

${file:n}удаляет первые nсимволы в строке file.


самый элегантный ответ.
Сэндвич
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.