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

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

У меня возникла проблема с переносом папок на внешний жесткий диск. Я не хочу менять форматирование жесткого диска.

Итак, в папке находятся сотни файлов, и ошибка, не позволяющая мне скопировать их, возникает из-за специальных символов (я не знаю, какие именно, но, по-моему, это «|» и «.», а также, я уверен, есть и другие. Я вручную переименовывал/удалял их, но это утомительно.

Открыт для предложений, но я "полагаю", что ищу способ либо удалить эти конкретные символы из имени файла (вызовет ли это проблему с .m4a и т. д.?), либо заменить их подчеркиванием, если необходимо. Единственная зацепка, которая у меня есть, это perl rename, но я пока не пробовал это.

переименовать 'y/|/_/' * вот так?

спасибо за любые предложения

решение1

Да, команда (на основе Perl) rename— хороший кандидат для этого. Вы можете добавить опцию -nили --nonoдля пробного запуска замен, например:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

так например

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

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

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

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

решение2

В целом mmvотлично подходит для задач массового переименования.

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

Приблизительный план:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Qдобавит двойные кавычки вокруг каждого имени, т. е. вы получите "foo*bar"или "foo | bar".

Затем замените нежелательные символы в /tmp/new.txt, либо вручную с помощью редактора, либо с помощью sed -i -e(или, perl -p -i -eесли вам так удобнее) или trили tr -d. Важно:не меняйте порядок в этом файле, не удаляйте и не добавляйте никаких строк!

В любом случае, хорошенько все обдумайте и /tmp/new.txtрешите, действительно ли вы хотите, чтобы новые названия выглядели именно так.

Проверьте наличие дубликатов имен! ( sort /tmp/new.txt | uniq -r) Убедитесь, что нет дубликатов, и если они есть, отредактируйте эту строку вручную, чтобы получить уникальное имя.

Затем соедините файлы с pasteкомандой и измените каждую строку на mvкоманду:

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

Что делает эта pasteкоманда, так это берет одну строку из /tmp/old.txtи одну строку из /tmp/new.txtи объединяет их в одну строку с пробелом между ними. sedЧасть добавляет mv -nк началу каждой из этих строк. mv -nпредотвращает перезапись существующего файла.

Теперь этот файл содержит много строк вроде

mv -n "foo" "bar"
mv -n "abc" "def"

Просмотрите файл еще раз, и когда вы убедитесь, что это то, что вам нужно, запустите его с помощью sh /tmp/bulk-rename.

Связанный контент