Что такое хорошая команда для удаления пробелов, дефисов и подчеркиваний из всех файлов в каталоге или выбранных файлов?
Я использую следующую команду с Thunar Custom Actions, чтобы убрать имена файлов:
for file in %N; do mv "$file" "$(echo "$file" | tr -s ' ' | tr ' A-Z' '-a-z' | tr -s '-' | tr -c '[:alnum:][:cntrl:].' '-')"; done
Но эта команда заменяет только пробелы / дефисы и символы в нижнем регистре.
Я использовал следующую команду в терминале для удаления пробелов из тысяч имен файлов в папке, и она работала довольно быстро:
rename "s/ //g" *
Опять же, он удаляет только пробелы, а не дефисы / тире и подчеркивания.
В идеале я не хочу пробелов, дефисов / тире и подчеркиваний в моих именах файлов. И было бы здорово, если бы эту команду можно было использовать с пользовательскими действиями Thunar для выбранных файлов.
shell-script
files
rename
user8547
источник
источник
rename -i "s/[-_ ]//g" *
echo $file | sed -e 's/[ _-]//g'
; сделаноОтветы:
Версия
rename
, поставляемая сperl
пакетом, поддерживает регулярные выражения:С другой стороны,
-i
Флаг будет сделатьrename
использовать интерактивный режим, побуждая , если цель уже существует, вместо того , чтобы молча перезапись.Переименование Perl иногда называют
prename
.Переименование Perl против переименования util-linux
В Debian-подобных системах переименование perl выглядит по умолчанию, и вышеприведенные команды должны просто работать.
В некоторых дистрибутивах
rename
утилита из util-linux используется по умолчанию. Эта утилита полностью несовместима с Perlrename
.Все: во- первых, проверьте,
rename
доступен ли Perl под этим именемprename
.Debian: переименование Perl должно быть по умолчанию. Это также доступно как
prename
. Однакоrename
исполняемый файл находится под контролем/etc/alternatives
и, таким образом, мог быть изменен на что-то другое.archlinux: Запустите
pacman -S perl-rename
и команда доступна какperl-rename
. Для более удобного имени создайте псевдоним. (Наконечник шляпы: ChiseledAbs)Mac OSX Согласно этому ответу ,
rename
может быть установлен на OSX с помощью homebrew через:Прямая загрузка:
rename
также доступна от Perl Monks:источник
rename
ты говоришь. Тот из util-linux -2.24.2-1.fc20.x86_64 не поддерживает регулярные выражения.rename
которую использовал OP, выглядит какperl
версия, а неutil-linux
версия.rename
справочная страница для версии util-linux . В любом случае, кроме этой записки, важно то, что ОП получил свой ответ (и вы от меня откликнулись :-D).pacman -S perl-rename
тогда, я думаю, вы можете псевдоним.Я бы заменил все эти
tr
командыsed
командой подстановки, например:источник
Не считая
mv
, вам вообще не нужен внешний процесс для этого - вы можете просто как-то их испортить .Тем не менее, это означает, что
mv
вызов для файла, и, вероятноrename
, лучше. Хотя это должно срабатывать , только POSIXmv
в$PATH
и POSIX оболочки.Итак, я придумал какое-то сумасшедшее демо для этого. Тестовый набор генерируется как:
Во-первых, я буду первым, кто признает, что приведенная выше команда дает результаты, которые легче получить другими способами. Но другие средства, вероятно, также не продемонстрируют, что можно сделать с
$IFS
небольшим (больным?) Воображением.Итак, первый бит довольно прост:
tee
передает 5 копий входных данных - наследственный документ называетсяCGEN
dd
блокирует его ввод с помощью новых строк по 90 байт на блок и передает это ...sed
объединяет 2 из этих блоков в два\n
символа ewline, заключает в'
кавычки результаты и добавляет строкуtouch --
для каждого цикла строки перед тем, как передать ...sh
который затем выполняет весь ввод как команды оболочки#CGEN
Немного , хотя ... Ну, короче ...дно
printf
печатает 252 0сследующий из последнего получает 252
''
аргумента с нулевой строкой, и для каждого из них выводится содержимое, за$n
которым следует строка" $i "
eval
интерпретирует аргументы следующего до того,printf
как он напечатает результаты этой интерпретации как восьмеричные числа с добавлением двух обратных косых чертпоследний
printf
выводит значения байтов для этих восьмеричных чисел 2 за раз, за которым следует строка-_ ---___
для каждой пары$n
инициализируется уравнением, которое будет увеличиваться$i
на единицу для каждой оценки, за исключением того, что оно пропускает значения 10, 39 или 47 - (которые являются\n
ewline,'
одинарными кавычками и/
косой чертой в десятичном формате ASCII соответственно)Конечным результатом является каталог, содержащий множество действительно уродливых имен файлов, содержащих каждый байт в моей кодировке от 1 до 255, за исключением одинарных кавычек (пропущен только для того, чтобы избежать еще одного
sed s///
оператора) и/
косой черты. Эти имена файлов выглядят так:Теперь я получу некоторые данные об этих файлах:
ВЫВОД
ОК. Теперь, наконец, к действию:
ВЫВОД
Успех! Вы можете увидеть сами:
источник
IFS
+printf
set -- 'some arbitrary' args; eval printf '"%s\n"' "$(IFS=0; printf ' "$@" %s' $(printf %025d))"
new="$(IFS=" -_"; printf %s $1)"
разветвляется подоболочка (кроме ksh93) и имеет проблемы с переводом строк. Другой вариант - использоватьIFS=' -_'; set -- $1; IFS=; new="$*"
(и изменить цикл while на цикл for)[ -e x ]
вернет false, еслиx
это символическая ссылка на несуществующий или недоступный файл.если у вас есть Perl, вы обычно переименовываете. ты можешь сделать:
и покажите, как написан этот скрипт:
Этот скрипт не поддерживает флаг -i (это версия в моей системе), но, возможно, ваш поддерживает. Как насчет аргументов. Во-первых, это регулярные выражения в формате PCRE, он работает как фильтр, изменяет имя ввода на имя вывода. Список названий вводимых вами звездочек '*'. например, вы делаете:
в действительности '*' может быть расширен до:
Когда у вас действительно большое количество файлов, вы попали в ловушку. Оболочка будет расширять вашу линию дольше, чем система принимает. тогда вы можете сделать обходной путь, используя find или xargs. использование 'find' является проблемой, потому что переименование будет вызываться много раз, равное количеству файлов в каталоге. лучше использовать xargs с опцией -r. один переименовать вызов изменить много файлов. например:
Последняя проблема, что это значит:
это регулярное выражение для изменения имен. после первого '/' пробел. это обнаруживается и заменяется строкой после второго '/'. Но есть пустая строка, оканчивающаяся на третью '/', затем пробел заменяется ничем. Опция «g» делает это выражение повторяющимся. выражение будет идти по всему имени от начала до конца и обнаруживает все пробелы.
Но что, если у вас есть символ табуляции или другой «белый» символ? есть замена для этого '\ s'. какие еще ненужные персонажи? просто добавьте это к выражению. Все закрываются скобками, например:
это все. ты видишь сходство? Я думаю, вы должны прочитать man perlrequick и man perlretut, это объяснит вам (я надеюсь), как работает регулярное выражение. Вы можете использовать команду переименования в своем собственном скрипте, если вам это нужно.
источник
Следующий
sh
цикл оболочки удалит все пробелы, подчеркивания и тире из имен файлов в текущем каталоге, стараясь не перезаписывать существующие файлы:Для
bash
иksh
, и быть немного более многословным с логикой:Удалите,
echo
когда вы уверены, что он делает то, что вы хотите, чтобы он делал.Команда
tr
удалит (-d
) любой символ в данном наборе символов (' _-'
). Важно иметь тире в самом начале или в конце набора, иначе он будет интерпретирован как диапазон символов.источник