Это просто. Я терпеть не могу, когда люди используют пробелы при именовании файлов. Иногда это портит консольные команды и делает вывод ls безобразным.
Задача состоит в том, чтобы написать программу (только символы ascii), которая
- переименовывает все файлы (включая каталоги) в текущем каталоге в версии с удаленными пробелами или замененными на '_'
- при столкновении необходимо добавить уникальный идентификатор (до вас)
- спускается рекурсивно во все подкаталоги
Вы можете принять имена путей в стиле UNIX. Кому нужна эта программа на компьютере с Windows?
Это код гольф, выигрывает самая короткая программа (#ascii символов). Так как я очень ненавижу пробелы, каждый пробел должен быть посчитан дважды.
Пожалуйста, укажите свой язык, оценку, программу и краткое описание того, как ее запустить.
Программа должна компилироваться и выполняться с разумными усилиями на моем компьютере с Linux.
РЕДАКТИРОВАТЬ: Поскольку Etan запросил файловую структуру для тестирования, вот сценарий, который я сейчас использую для создания подходящего дерева файлов:
#!/bin/bash
rm -r TestDir
touchfiles()
{
touch my_file
touch my__file
touch "my file"
touch "my file"
touch " my_file "
}
mkdir TestDir
cd TestDir
touchfiles
for dir in "Test Sub" Test_Sub "Te stSub" Te_stSub
do
mkdir "$dir"
cd "$dir"
touchfiles
cd ..
done
источник
Ответы:
Zsh + GNU coreutils - 48 байт (1 пробел)
Странно, что вы ненавидите пробелы (ASCII), но хорошо справляетесь со знаками табуляции и переводами строки, но я думаю, что это занимает все виды
zmv решает множество проблем с переименованием файлов кратко (и немного неясно). Тем не менее, он настаивает на том, чтобы цели были уникальными; в то время как вы можете легко добавлять уникальные суффиксы, добавление суффикса только в том случае, если это потребуется, в значительной степени требует повторного выполнения всей работы. Поэтому вместо этого я зацикливаюсь вручную и полагаюсь на GNU mv для добавления уникального идентификатора в случае коллизии (
--backup
опция, плюс--no-target-directory
в случае, если целью является существующий каталог, в противном случае источникmv
будет перемещен в этот каталог).(od)
является префиксом glob для сортировки выходных данных с каталогами, появляющимися после их содержимого (например, find-depth
).D
включает в себя точечные файлы в глобусе.:h
и:t
являются модификаторы истории похожи наdirname
иbasename
.mv
жалуется на то, что он вызывается для переименования файлов, потому что глобус содержит имена файлов без пробелов. Такова жизнь.Безголовая версия:
источник
zmv
бомбmv
есть шанс разобраться в столкновениях. Хорошо, я делаю это вручную. Получается точно такой же длины, если я пропускаю точечные файлы и даже сохраняю символ, если я этого не делаю.Bash 116 байтов, 16 пробелов
Я не подавлял ошибки, чтобы получить еще пару байтов. Это не будет иметь никаких столкновений.
Если
find
можно ожидать не-posix GNU , это может быть сокращено далее:Bash 110 байтов, 15 пробелов
Удаление пробелов вместо их замены использует два меньших байта:
Bash 108 байтов, 15 пробелов
Примечание: если вместо пробелов можно использовать табуляции, требуется только 1 пробел (тот, что в правиле соответствия для подстановки в строке 2).
Спасибо Деннису за то, что он нашел ошибку в двойных кавычках (и предоставил решение)
источник
-depth
в GNU можно заменить-d
, хотя жалуется, что это устарело. Я не знаю о правилах гольфа, могу ли я это сделать?bash -c 'B=${0##*/}...' {} \;
вместо этого, который на самом деле короче.N
переменной? Это никогда не определяется ...Python 180 байт
только 2 пробела, если вы используете табуляцию для отступа :-)
источник
Если порядок сопоставленных суффиксов файлов не должен создавать прецедент для ранее существовавшего файла, тогда мне подходит следующее:
bash / find / mv 84 байта, 16 пробелов
bash / find / mv 82 байта, 14 пробелов
Обнимались,
&&
чтобы сохранить два космических байта.bash / find / mv 60 байт, 11 пробелов
Сбрасывает защиту от ошибок, поэтому он получает ошибки от mv для файлов, у которых нет пробелов для начала.
Изменить: Отбросил цитаты,
{}
как напомнил Деннис. Также разрешеноfind
кричать о переносимости и устаревании в самой короткой версии, гдеmv
уже кричат о перемещении файла поверх самого себя.Редактировать 2: Добавлено
-T
вmv
команду, чтобы избежать вложения каталогов вместо переименования, как указано в pqnet. Используется расширение скобки по стоимости одного символа, а не только один пробел.источник
-d
вместо-depth
и вам не нужны кавычки{}
.-d
разговор в ответе pqnet, но решил, что, так как я заставил себя замолчатьmv
криком, я бы избежалfind
крика. Хотя, наверное, мне стоит сократить его до кричащего. И да, я всегда цитирую{}
по какой-то причине, хотя знаю, что в этом случае нет необходимости. Сила привычки, наверное.-T
опцию, чтобыmv
избежать этогоNodeJS - 209 байт, 3 пробела
источник
node file.js
TypeError: Object #<Object> has no method 'exists'
. Угадайте, где: это в строке 1! : DБаш - 86 байт
источник
--backup
до--b
Bash + Perl
rename
64(
rename
это скрипт Perl для Debian и производных, а не команда util-linux.)источник
*
должно быть{}
, в таком виде это переименовывает только файлы, чье имя появляется в текущем каталоге. Это не добавляет суффикс в случае коллизии. Вы можете сэкономить немного, пропустив,-name "* *"
так какrename
молча игнорирует файлы, имя которых не преобразовано.POSIX
sh
+ GNUfind
+ GNUmv
67 ASCII байт + один (буквальный) пробелЯ не знаю, подходит ли это, но с этим любым последовательность пробелов сводится к одному
_
- мне все равно нравится. На самом деле любая последовательность, кроме начальных / конечных пробелов, то есть те, которые автоматически усекаются (что, я думаю, также является полезным поведением) . Спасибо Жилю за указание на это.Это просто использует внутренний разделитель полей для разделения полей.
Это довольно ... болтливый ...
...о чувак. Я знал, что вкладка была дешевой, но я думал, что это по крайней мере умно. Теперь я просто опаздываю на вечеринку ...
источник
IFS
волшебную штуку ...$expand
не (ex pand)) и только что упомянутой вещью ifsws. Смотрите здесь-exec
с-execdir
. Еще одна странность, оIFS
которой вы не упоминаете, заключается в том, что завершающие пробелы удаляются. Обратите внимание, что, как и другие заметили, вам также нужна-T
опцияmv
, когда цельюmv
вызова является существующий каталог.sh -c 'mkdir -p ../newtree/"$0"; ln "$0"/* ../newtree/$0 {} \;
и другие глобусы вfind -type d
команде для создания зеркального дерева жестких ссылок, а затем оперировать ими, но я предпочитаю написать код-гольф вообще для операции перемещения. Хорошие замечания по поводу начальных / конечных пробелов, хотя я думаю, что такое поведение я бы предпочел.zsh
«s встроено функцииzmv
, например.PHP,
147145 байт,21 пробелс-> 146рекурсивная функция. Бежать с
s(".");
Переберите
glob
результаты для данного пути:источник
Рубин 121
источник
gam3.rb:5:in `rename': Directory not empty - ./Te stSub or ./Te_stSub (Errno::ENOTEMPTY) from gam3.rb:5 from /usr/lib/ruby/1.8/find.rb:39:in `find' from /usr/lib/ruby/1.8/find.rb:38:in `catch' from /usr/lib/ruby/1.8/find.rb:38:in `find' from gam3.rb:3
Питон, 187
165 плюс 22 штрафных очка за пробелы.
166, используя трюк Эмануэле :
Только один пробел в этом!
источник
LiveScript - 166
(Замените пробелы символами табуляции.)
На основе nderscore в оптимизированной версии из CPU1 «s ответа .
источник
Bash 4+ 111 байт
источник
Groovy, 139 знаковв соответствии с комментарием @ edc65
Groovy, обрабатывать столкновения, 259 символов
источник
POSIX (протестировано на zsh) + основные команды Linux 151
источник
$(ls -CR)
полностью фальшивый-c
Опция бесполезна, и-R
получает вас файлы без их каталога, который бессмысленно. Ваша архитектура принципиально не будет обрабатывать имена файлов, содержащие переводы строк. Вам нужно,set -f
иначе имена файлов, содержащие подстановочные знаки, взорвутся.export
бесполезно. Я смутно вижу, что вы пытаетесь сделать, чтобы унифицировать файлы, но трубка неправильная.