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


10

Я повинен перейменувати кілька файлів у каталозі, видаливши перші 5 символів для кожного імені файлу.
Як я можу це зробити i bash / shell? Я використовую Ubuntu 11.10. Дякую.

Відповіді:


11

Простий цикл з трохи 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.