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