2010-01-15 3 views
8

У меня есть каталог с кучей файлов с именами, как:Bash команды, чтобы удалить начальные нули из всех имен файлов

0.jpg 
0.jpg 
004729342.jpg 

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

1234.jpg 
1235.jpg 
4729342.jpg 

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

+0

Примечание: это будет сделать сортировку более трудным. –

+1

С GNU coreutils 'ls -v' будет сортировать номера естественным образом (используя расширения Glibc' versionort (3)/strverscmp (3) '). Но да, в общем, изменение числовых частей имен файлов, чтобы больше не выстраиваться в линию по длине, изменяет нормальный порядок сортировки. – ephemient

ответ

7
for FILE in `ls`; do mv $FILE `echo $FILE | sed -e 's:^0*::'`; done 
+1

Вам не нужно (и не следует) использовать 'ls', как это. Сделайте это так: 'для FILE в *' –

+1

это плохой пример. сначала используя ls, а затем никогда не цитируйте свои переменные – ghostdog74

+0

Я не вижу проблем с использованием ls. Вы можете заменить его на команду find, предложенную ниже, или любую другую команду. Так как это работает, я не вижу, какие ваши оправдания отличаются от стилистических, что, когда дело доходит до сценариев с одной строкой, кажется немного бессмысленным. – cyborg

1

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

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

Полный цикл:

for f in `ls`; do 
    mv $f $(echo $f | sed -e 's:^0*::') 
done 
+0

Как передать содержимое каталога в эту команду? – George

+0

обновил сообщение – eduffy

+0

Это, вероятно, достаточно хорошо для ситуации Джорджа, но в другой среде, возможно, вы захотите обработать специальный случай, когда имя файла равно нулю. –

0

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

for i in 0* 
do 
mv "${i}" "`expr "${i}" : '0*\(.*\)'`" 
done 
+0

Необходимо выполнить форматирование. Используйте 4 пробела перед «для», чтобы сделать всю строку кодированной секцией. – bradlis7

0

Я не знаю СЕПГ на всех, но вы можете получить список с помощью find:

find -type f -name *.jpg

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

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

но я не знаю, поддерживает ли команда sed или нет.

7

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

Проверьте, пожалуйста, Rename multiple files with Linux страница для некоторых идей. Одна из идей, предложенных заключается в использовании скрипт rename PERL:

rename 's/^0*//' *.jpg 
+0

Мне нравится эта команда, но, к сожалению, она не установлена ​​на каждой системе :( –

+0

«sed сам по себе является неправильным инструментом для этого»? Http://xkcd.com/285/ – BryanH

+0

@BryanH: ?? Это не Википедия , поэтому я не уверен в причине вашего мультфильма xkcd. Точка, которую я пытаюсь сделать (думаю, это было около 18 месяцев назад), заключалась в том, что сам sed не может переименовывать файлы - вам понадобится некоторые дополнительные скрипты, чтобы пойти с ним. –

0

Вот один, который не требует 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 
6

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

shopt -s extglob 
for i in 0*[^0]; do mv "$i" "${i##*(0)}"; done 
+0

это должен быть принятый ответ – zero0cool

0

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

shopt -s nullglob 
for file in 0*.jpg 
do 
    echo mv "$file" "${file##*0}" 
done 
Смежные вопросы