Команда Bash для удаления начальных нулей из всех имен файлов - PullRequest
8 голосов
/ 15 января 2010

У меня есть каталог с кучей файлов с такими именами, как:

001234.jpg
001235.jpg
004729342.jpg

Я хочу удалить начальные нули из всех имен файлов, поэтому мне осталось бы:

1234.jpg
1235.jpg
4729342.jpg

Я пробовал разные конфигурации sed, но не могу найти правильный синтаксис.Есть ли простой способ перечислить все файлы в каталоге, передать его через sed, а затем переместить или скопировать их в новое имя файла без начальных нулей?

Ответы [ 8 ]

10 голосов
/ 15 января 2010

sed сам по себе является неправильным инструментом для этого: вам также необходимо использовать некоторые сценарии оболочки.

Проверьте Переименуйте несколько файлов на странице Linux для некоторых идей. Одна из предложенных идей - использовать rename скрипт perl:

rename 's/^0*//' *.jpg
9 голосов
/ 15 января 2010
for FILE in `ls`; do mv $FILE `echo $FILE | sed -e 's:^0*::'`; done
7 голосов
/ 16 января 2010

В Bash, который, вероятно, будет вашей оболочкой для входа в систему по умолчанию, внешние команды не требуются.

shopt -s extglob
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done
1 голос
/ 15 января 2010

Попробуйте использовать sed, например ::

sed -e 's:^0*::'

Полный цикл:

for f in `ls`; do
   mv $f $(echo $f | sed -e 's:^0*::')
done
0 голосов
/ 16 января 2010

В оболочке Bash вы можете сделать:

shopt -s nullglob
for file in 0*.jpg
do
   echo mv "$file" "${file##*0}"
done
0 голосов
/ 16 января 2010

Вот тот, который не требует sed:

for x in *.jpg ; do let num="10#${x%%.jpg}"; mv $x ${num}.jpg ;  done

Обратите внимание, что это ТОЛЬКО работает, когда имена файлов - все числа. Вы также можете удалить ведущие нули с помощью оболочки:

for a in *.jpg ; do dest=${a/*(0)/} ; mv $a $dest ; done
0 голосов
/ 15 января 2010

Я вообще не знаю sed, но вы можете получить список, используя find:

find -type f -name *.jpg

так что с другим ответом это может выглядеть как

find . -type f -name *.jpg | sed -e 's:^0*::'

но я не знаю, выполняется ли эта команда sed или нет.

0 голосов
/ 15 января 2010

Может быть, не самый элегантный, но это будет работать.

for i in 0*
do
mv "${i}" "`expr "${i}" : '0*\(.*\)'`"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...