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

Для записи ниже menu.lst запускает Ubuntu 16.04 (Xenial) на 32-битной машине:

title Run Ubuntu 16.04 32-bit
find --set-root /ubuntu-16.04-desktop-i386.iso
map --heads=0 --sectors-per-track=0 /ubuntu-16.04-desktop-i386.iso (0xff) || map --mem /ubuntu-16.04-desktop-i386.iso (0xff)
map --hook
root (0xff)
kernel /casper/vmlinuz  file=/preseed/ubuntu.seed noprompt boot=casper iso-scan/filename=/ubuntu-16.04-desktop-i386.iso quiet splash --
initrd /casper/initrd.lz

title supergrub2disk iso
map --heads=0 --sectors-per-track=0 (hd0,0)/super_grub2_disk_hybrid_2.02s3.iso (hd32)
map --hook
chainloader (hd32)
boot
3
задан 14 November 2017 в 20:32

9 ответов

Вы можете добиться этого с помощью цикла for и некоторого расширения bash. Если вы уже находитесь в каталоге, содержащем файлы:

for f in ./*; do mv "$f" "${f%.*.gif}.gif" ; done

Если ваш каталог, содержащий файлы, называется / home / gifstore /:

for f in /home/gifstore/*; do mv "$f" "${f%.*.gif}.gif" ; done

${f...} выполняет расширение каждого имени файла, которое мы сохранили, в переменную с именем f. [F5] в расширении имени файла означает удаление кратчайшего соответствия следующего шаблона с конца переменной. Шаблон - .*.gif, что означает любое количество символов между . и .gif. Наконец, мы добавляем литеральную строку .gif за пределы расширения для создания нашего нового имени файла и полагаемся на команду mv для перемещения файла.

Это не будет работать для скрытых файлов, начиная с ..

3
ответ дан 22 May 2018 в 16:14
  • 1
    Он работает так хорошо! : D Очень простое и фантастическое объяснение! Спасибо!! – A.V 14 November 2017 в 20:25

Вы можете добиться этого с помощью цикла for и некоторого расширения bash. Если вы уже находитесь в каталоге, содержащем файлы:

for f in ./*; do mv "$f" "${f%.*.gif}.gif" ; done

Если ваш каталог, содержащий файлы, называется / home / gifstore /:

for f in /home/gifstore/*; do mv "$f" "${f%.*.gif}.gif" ; done

${f...} выполняет расширение каждого имени файла, которое мы сохранили, в переменную с именем f. [F5] в расширении имени файла означает удаление кратчайшего соответствия следующего шаблона с конца переменной. Шаблон - .*.gif, что означает любое количество символов между . и .gif. Наконец, мы добавляем литеральную строку .gif за пределы расширения для создания нашего нового имени файла и полагаемся на команду mv для перемещения файла.

Это не будет работать для скрытых файлов, начиная с ..

3
ответ дан 18 July 2018 в 03:17

Вы можете добиться этого с помощью цикла for и некоторого расширения bash. Если вы уже находитесь в каталоге, содержащем файлы:

for f in ./*; do mv "$f" "${f%.*.gif}.gif" ; done

Если ваш каталог, содержащий файлы, называется / home / gifstore /:

for f in /home/gifstore/*; do mv "$f" "${f%.*.gif}.gif" ; done

${f...} выполняет расширение каждого имени файла, которое мы сохранили, в переменную с именем f. [F5] в расширении имени файла означает удаление кратчайшего соответствия следующего шаблона с конца переменной. Шаблон - .*.gif, что означает любое количество символов между . и .gif. Наконец, мы добавляем литеральную строку .gif за пределы расширения для создания нашего нового имени файла и полагаемся на команду mv для перемещения файла.

Это не будет работать для скрытых файлов, начиная с ..

3
ответ дан 24 July 2018 в 17:48

Команда rename (вы также можете запустить ее как file-rename) хорошо подходит для этой задачи. Есть несколько способов использовать его здесь. Я предлагаю это, хотя я покажу альтернативу ниже:

rename -n 's/^\d{8}_\d\d\K\.\d+//' *.gif

Опция -n позволяет просто распечатать, какие операции переименования будут первыми. После того, как вы довольны этим, запустите его снова без -n, чтобы выполнить фактическое переименование. Одним из преимуществ rename является то, что он не будет перезаписывать файлы (если вы не передадите ему параметр -f, который вы должны очень редко делать). Это особенно хорошо здесь, потому что вы удаляете части из имен файлов, которые потенциально могут привести к коллизии имен. Даже если коллизии не обнаружены при выполнении имитации с помощью -n, они будут пойманы при фактическом переименовании.

С четырьмя показанными вами файлами эта команда покажет этот результат:

rename(22771786_01.204.gif, 22771786_01.gif)
rename(22771786_02.203.gif, 22771786_02.gif)
rename(22771786_03.10.gif, 22771786_03.gif)
rename(22771786_04.56.gif, 22771786_04.gif)

Конечно, ваш вывод будет длиннее, если у вас есть более четырех файлов, которые, как я полагаю, вы делаете.

Способ, которым команда что s/ выполняет подстановку. Имена файлов, которые содержат текст, соответствующий rename ^\d{8}_\d\d\K\.\d+, изменяются так, что совпадение стирается, т.е. заменяется пустой строкой, которая находится между / и / в //, который следует за ним.

Хотя регулярное выражение может быть записано таким образом, чтобы обеспечить работу только файлов, заканчивающихся на .gif, это необязательно, потому что вы можете передать только .gif имена файлов rename. Оболочка расширяет *.gif до списка этих файлов и передает этот список команде rename. Обратите внимание, что синтаксис, используемый оболочкой для расширения имени файла, - это не то же самое, что регулярные выражения. * не имеет того же значения, что и в регулярных выражениях.

Вот что делает регулярное выражение ^\d{8}_\d\d\K\.\d+:

^ привязывает начало строки. \d{8} соответствует последовательности ровно восьми цифр. _ соответствует литералу _. Это не особо. \d\d соответствует еще двум цифрам. \K забывает предыдущие совпадающие символы. В конце концов, это те персонажи, которые мы хотим сохранить, а не те, которые хотим заменить. Эффект состоит в том, чтобы гарантировать, что эти символы присутствуют непосредственно перед частью, которую мы фактически заменим. \. соответствует буквалу .. Обратная косая черта необходима, потому что, когда точка появляется в регулярном выражении, она в противном случае соответствует любому одиночному символу. \d+ соответствует одной или нескольким цифрам.

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

Можно написать более короткую команду rename, которая должна работать. Я выбрал этот подход - среди многих возможных подходов - потому что команда выражает точно схему именования, над которой вы хотите работать. Это означает, что решение похоже на проблему.

Если вы хотите использовать более простую команду rename, и вы знаете все .gif файлы в текущем каталоге названы в соответствии с вашим описанием и должны быть переименованы, вы можете использовать:

rename -n 's/\.\d+\.gif$/\.gif/' *

Помните, что -n просто показывает вам, что будет сделано, и вы должны удалить его для фактического переименования файлов.

В этой команде я включил суффикс .gif в регулярное выражение, поэтому вам не нужно фильтровать его в именах файлов, которые вы переходите на rename. Тем не менее, вы можете сделать это, если в текущем каталоге есть много файлов .gif, которые будут бессмысленно сопоставляться с *.

Вот что делает регулярное выражение \.\d+\.gif$:

^ привязывает к началу строки. \d+ соответствует одному или нескольким якорям . \d{8} соответствует последовательности ровно восьми цифр. gif соответствует буквальному тексту gif. _ соответствует буквалу _. Это не является особенным.

Таким образом, точка, конечные цифры и суффикс .gif совпадают, и все они заменяются только .gif.

1
ответ дан 22 May 2018 в 16:14
  • 1
    Очень круто и просто! Мне понравились оба представленных решения и добавлены в мою библиотеку полезных команд. Спасибо! : D – A.V 14 November 2017 в 20:45

Мне лично нравится использовать рейнджер для такого рода вещей. Он использует привязки клавиш Vim для навигации и т. Д., Поэтому, если вы не знакомы с vim, это может стать запутанным / сложным. Но если вы уже знакомы с Vim, это должна быть простая задача!

Шаг 1

Установите ranger. Вы можете установить его как ranger или просто загрузить файл .tar.gz с веб-сайта.

Шаг 1

Запустите Ranger и перейдите в каталог, в котором есть файлы, которые вы хотите переименовать. Я бы рекомендовал поместить все .gifs в один каталог. Убедитесь, что нет других файлов, кроме тех, которые вы хотите переименовать.

Шаг 3

Нажмите v, чтобы выбрать все файлы

Шаг 3

type :bulkrename и нажмите Enter

Шаг 5

Используйте макрос Vim для записи изменений, которые вы хотите сделать. Итак, для вашего примера, если вы начали в самой первой строке файла, вы должны использовать следующие команды:

q a (это запускает макрос с именем «a»)

[ f6], f., de (перемещает курсор к началу строки, находит первый «.», а затем удаляет последний символ перед вторым «.» перед gif)

q (чтобы остановить запись макроса)

Шаг 5

Перейдите ко второй строке и переместите курсор к началу строки (j , 0) и введите :2,$norm! @a

Это приведет к завершению только что сделанного вами макроса (с именем «a») со второй строки до конца файла.

Шаг 7

:wq для сохранения и выхода, а затем :wq снова для подтверждения изменений.

Итак, если все идет хорошо, вы должны переименовали все ваши файлы. Если вы раньше не использовали Vim, я бы рекомендовал использовать другой ответ, поэтому вам не нужно изучать Vim только для переименования файлов. Я предпочитаю использовать Vim, поэтому это мой метод выбора при массовом переименовании.

0
ответ дан 22 May 2018 в 16:14

Команда rename (вы также можете запустить ее как file-rename) хорошо подходит для этой задачи. Есть несколько способов использовать его здесь. Я предлагаю это, хотя я покажу альтернативу ниже:

rename -n 's/^\d{8}_\d\d\K\.\d+//' *.gif

Опция -n позволяет просто распечатать, какие операции переименования будут первыми. После того, как вы довольны этим, запустите его снова без -n, чтобы выполнить фактическое переименование. Одним из преимуществ rename является то, что он не будет перезаписывать файлы (если вы не передадите ему параметр -f, который вы должны очень редко делать). Это особенно хорошо здесь, потому что вы удаляете части из имен файлов, которые потенциально могут привести к коллизии имен. Даже если коллизии не обнаружены при выполнении имитации с помощью -n, они будут пойманы при фактическом переименовании.

С четырьмя показанными вами файлами эта команда покажет этот результат:

rename(22771786_01.204.gif, 22771786_01.gif) rename(22771786_02.203.gif, 22771786_02.gif) rename(22771786_03.10.gif, 22771786_03.gif) rename(22771786_04.56.gif, 22771786_04.gif)

Конечно, ваш вывод будет длиннее, если у вас есть более четырех файлов, которые, как я полагаю, вы делаете.

Способ, которым команда что s/ выполняет подстановку. Имена файлов, которые содержат текст, соответствующий rename ^\d{8}_\d\d\K\.\d+, изменяются так, что совпадение стирается, т.е. заменяется пустой строкой, которая находится между / и / в //, который следует за ним.

Хотя регулярное выражение может быть записано таким образом, чтобы обеспечить работу только файлов, заканчивающихся на .gif, это необязательно, потому что вы можете передать только .gif имена файлов rename. Оболочка расширяет *.gif до списка этих файлов и передает этот список команде rename. Обратите внимание, что синтаксис, используемый оболочкой для расширения имени файла, - это не то же самое, что регулярные выражения. * не имеет того же значения, что и в регулярных выражениях.

Вот что делает регулярное выражение ^\d{8}_\d\d\K\.\d+:

^ привязывает начало строки. \d{8} соответствует последовательности ровно восьми цифр. _ соответствует литералу _. Это не особо. \d\d соответствует еще двум цифрам. \K забывает предыдущие совпадающие символы. В конце концов, это те персонажи, которые мы хотим сохранить, а не те, которые хотим заменить. Эффект состоит в том, чтобы гарантировать, что эти символы присутствуют непосредственно перед частью, которую мы фактически заменим. \. соответствует буквалу .. Обратная косая черта необходима, потому что, когда точка появляется в регулярном выражении, она в противном случае соответствует любому одиночному символу. \d+ соответствует одной или нескольким цифрам.

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

Можно написать более короткую команду rename, которая должна работать. Я выбрал этот подход - среди многих возможных подходов - потому что команда выражает точно схему именования, над которой вы хотите работать. Это означает, что решение похоже на проблему.

Если вы хотите использовать более простую команду rename, и вы знаете все .gif файлы в текущем каталоге названы в соответствии с вашим описанием и должны быть переименованы, вы можете использовать:

rename -n 's/\.\d+\.gif$/\.gif/' *

Помните, что -n просто показывает вам, что будет сделано, и вы должны удалить его для фактического переименования файлов.

В этой команде я включил суффикс .gif в регулярное выражение, поэтому вам не нужно фильтровать его в именах файлов, которые вы переходите на rename. Тем не менее, вы можете сделать это, если в текущем каталоге есть много файлов .gif, которые будут бессмысленно сопоставляться с *.

Вот что делает регулярное выражение \.\d+\.gif$:

^ привязывает к началу строки. \d+ соответствует одному или нескольким якорям . \d{8} соответствует последовательности ровно восьми цифр. gif соответствует буквальному тексту gif. _ соответствует буквалу _. Это не является особенным.

Таким образом, точка, конечные цифры и суффикс .gif совпадают, и все они заменяются только .gif.

1
ответ дан 18 July 2018 в 03:17

Мне лично нравится использовать рейнджер для такого рода вещей. Он использует привязки клавиш Vim для навигации и т. Д., Поэтому, если вы не знакомы с vim, это может стать запутанным / сложным. Но если вы уже знакомы с Vim, это должна быть простая задача!

Шаг 1

Установите ranger. Вы можете установить его как ranger или просто загрузить файл .tar.gz с веб-сайта.

Шаг 1

Запустите Ranger и перейдите в каталог, в котором есть файлы, которые вы хотите переименовать. Я бы рекомендовал поместить все .gifs в один каталог. Убедитесь, что нет других файлов, кроме тех, которые вы хотите переименовать.

Шаг 3

Нажмите v, чтобы выбрать все файлы

Шаг 3

type :bulkrename и нажмите Enter

Шаг 5

Используйте макрос Vim для записи изменений, которые вы хотите сделать. Итак, для вашего примера, если вы начали в самой первой строке файла, вы должны использовать следующие команды:

q a (это запускает макрос с именем «a»)

0, f., de (перемещает курсор к началу строки, находит первый «.», а затем удаляет последний символ перед вторым «.» перед gif)

q (чтобы остановить запись макроса)

Шаг 5

Перейдите ко второй строке и переместите курсор к началу строки (j , 0) и введите :2,$norm! @a

Это приведет к завершению только что сделанного вами макроса (с именем «a») со второй строки до конца файла.

Шаг 7

:wq для сохранения и выхода, а затем :wq снова для подтверждения изменений.

Итак, если все идет хорошо, вы должны переименовали все ваши файлы. Если вы раньше не использовали Vim, я бы рекомендовал использовать другой ответ, поэтому вам не нужно изучать Vim только для переименования файлов. Я предпочитаю использовать Vim, поэтому это мой метод выбора при массовом переименовании.

0
ответ дан 18 July 2018 в 03:17

Команда rename (вы также можете запустить ее как file-rename) хорошо подходит для этой задачи. Есть несколько способов использовать его здесь. Я предлагаю это, хотя я покажу альтернативу ниже:

rename -n 's/^\d{8}_\d\d\K\.\d+//' *.gif

Опция -n позволяет просто распечатать, какие операции переименования будут первыми. После того, как вы довольны этим, запустите его снова без -n, чтобы выполнить фактическое переименование. Одним из преимуществ rename является то, что он не будет перезаписывать файлы (если вы не передадите ему параметр -f, который вы должны очень редко делать). Это особенно хорошо здесь, потому что вы удаляете части из имен файлов, которые потенциально могут привести к коллизии имен. Даже если коллизии не обнаружены при выполнении имитации с помощью -n, они будут пойманы при фактическом переименовании.

С четырьмя показанными вами файлами эта команда покажет этот результат:

rename(22771786_01.204.gif, 22771786_01.gif) rename(22771786_02.203.gif, 22771786_02.gif) rename(22771786_03.10.gif, 22771786_03.gif) rename(22771786_04.56.gif, 22771786_04.gif)

Конечно, ваш вывод будет длиннее, если у вас есть более четырех файлов, которые, как я полагаю, вы делаете.

Способ, которым команда что s/ выполняет подстановку. Имена файлов, которые содержат текст, соответствующий rename ^\d{8}_\d\d\K\.\d+, изменяются так, что совпадение стирается, т.е. заменяется пустой строкой, которая находится между / и / в //, который следует за ним.

Хотя регулярное выражение может быть записано таким образом, чтобы обеспечить работу только файлов, заканчивающихся на .gif, это необязательно, потому что вы можете передать только .gif имена файлов rename. Оболочка расширяет *.gif до списка этих файлов и передает этот список команде rename. Обратите внимание, что синтаксис, используемый оболочкой для расширения имени файла, - это не то же самое, что регулярные выражения. * не имеет того же значения, что и в регулярных выражениях.

Вот что делает регулярное выражение ^\d{8}_\d\d\K\.\d+:

^ привязывает начало строки. \d{8} соответствует последовательности ровно восьми цифр. _ соответствует литералу _. Это не особо. \d\d соответствует еще двум цифрам. \K забывает предыдущие совпадающие символы. В конце концов, это те персонажи, которые мы хотим сохранить, а не те, которые хотим заменить. Эффект состоит в том, чтобы гарантировать, что эти символы присутствуют непосредственно перед частью, которую мы фактически заменим. \. соответствует буквалу .. Обратная косая черта необходима, потому что, когда точка появляется в регулярном выражении, она в противном случае соответствует любому одиночному символу. \d+ соответствует одной или нескольким цифрам.

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

Можно написать более короткую команду rename, которая должна работать. Я выбрал этот подход - среди многих возможных подходов - потому что команда выражает точно схему именования, над которой вы хотите работать. Это означает, что решение похоже на проблему.

Если вы хотите использовать более простую команду rename, и вы знаете все .gif файлы в текущем каталоге названы в соответствии с вашим описанием и должны быть переименованы, вы можете использовать:

rename -n 's/\.\d+\.gif$/\.gif/' *

Помните, что -n просто показывает вам, что будет сделано, и вы должны удалить его для фактического переименования файлов.

В этой команде я включил суффикс .gif в регулярное выражение, поэтому вам не нужно фильтровать его в именах файлов, которые вы переходите на rename. Тем не менее, вы можете сделать это, если в текущем каталоге есть много файлов .gif, которые будут бессмысленно сопоставляться с *.

Вот что делает регулярное выражение \.\d+\.gif$:

^ привязывает к началу строки. \d+ соответствует одному или нескольким якорям . \d{8} соответствует последовательности ровно восьми цифр. gif соответствует буквальному тексту gif. _ соответствует буквалу _. Это не является особенным.

Таким образом, точка, конечные цифры и суффикс .gif совпадают, и все они заменяются только .gif.

1
ответ дан 24 July 2018 в 17:48
  • 1
    Очень круто и просто! Мне понравились оба представленных решения и добавлены в мою библиотеку полезных команд. Спасибо! : D – A.V 14 November 2017 в 20:45

Мне лично нравится использовать рейнджер для такого рода вещей. Он использует привязки клавиш Vim для навигации и т. Д., Поэтому, если вы не знакомы с vim, это может стать запутанным / сложным. Но если вы уже знакомы с Vim, это должна быть простая задача!

Шаг 1

Установите ranger. Вы можете установить его как ranger или просто загрузить файл .tar.gz с веб-сайта.

Шаг 1

Запустите Ranger и перейдите в каталог, в котором есть файлы, которые вы хотите переименовать. Я бы рекомендовал поместить все .gifs в один каталог. Убедитесь, что нет других файлов, кроме тех, которые вы хотите переименовать.

Шаг 3

Нажмите v, чтобы выбрать все файлы

Шаг 3

type :bulkrename и нажмите Enter

Шаг 5

Используйте макрос Vim для записи изменений, которые вы хотите сделать. Итак, для вашего примера, если вы начали в самой первой строке файла, вы должны использовать следующие команды:

q a (это запускает макрос с именем «a»)

0, f., de (перемещает курсор к началу строки, находит первый «.», а затем удаляет последний символ перед вторым «.» перед gif)

q (чтобы остановить запись макроса)

Шаг 5

Перейдите ко второй строке и переместите курсор к началу строки (j , 0) и введите :2,$norm! @a

Это приведет к завершению только что сделанного вами макроса (с именем «a») со второй строки до конца файла.

Шаг 7

:wq для сохранения и выхода, а затем :wq снова для подтверждения изменений.

Итак, если все идет хорошо, вы должны переименовали все ваши файлы. Если вы раньше не использовали Vim, я бы рекомендовал использовать другой ответ, поэтому вам не нужно изучать Vim только для переименования файлов. Я предпочитаю использовать Vim, поэтому это мой метод выбора при массовом переименовании.

0
ответ дан 24 July 2018 в 17:48

Другие вопросы по тегам:

Похожие вопросы: