Удалите эти надоедливые файлы .DS_Store

13

Если вы используете OS X, то вы можете быть знакомы с печально известными скрытыми файлами «.DS_Store», которые создаются в результате использования Finder.

Задача состоит в том, чтобы написать код, который пройдет через всю файловую систему и удалит любой файл с именем «.DS_Store».

Классический код гольф - выигрывает самый короткий код.


Разъяснения:

  • Код не должен удалять любые файлы .DS_Store, которые требуют суперпользователя; предположим, что таких файлов не существует.

  • Код должен удалять только соответствующие файлы .DS_Store и ничего больше.

arshajii
источник
3
Нужно ли коду удалять файлы .DS_Store, для которых требуется суперпользователь (нужно ли вызывать sudo)?
Кая
1
@Kaya Хороший вопрос: нет, не нужно удалять такие файлы.
Аршаджи
27
Можно ли удалить файлы с именами , не .DS_Storeтакже ?
Джои Адамс
1
@JohannesKuhn Последнее редактирование должно быть самоочевидным, я бы предположил. Я добавил это для полноты картины. Но я ценю умный ответ, тем не менее!
Аршаджи
1
@Joey - перенести вопрос в военную сферу - например, хмм… военные США, наугад ^^. И замените «файл с именем .DS_Store» на «человека, которого нужно убить». И вы увидите, что требование «только» далеко не очевидно.
Николас Барбулеско

Ответы:

14

зш, 19

rm -f /**/.DS_Store

(Сделайте это 16, если все в порядке -f.)

копия
источник
12

Баш *, 40 30

find / -name .DS_Store -delete

find / -name .DS_Store -exec rm -f {} \;

Это должно справиться с этим (не очень игра в гольф, не замечательно медленно). Bash кажется правильным, потому что нам не приходится иметь дело с какой-то ерундой "системы импорта". Если вы хотите требовать выполнения в любой среде, добавьте 4 символа для bashи 1 для перевода строки.

* любая оболочка, я думаю, просто не может выйти из привычки, если предположить, что оболочка Борна снова - единственная.

Kaya
источник
1
Bash - именно то, что нужно для этого.
Йоханнес Кун
1
Что за findOS X? С GNU findеще короче find / -name .DS_Store -delete.
Манатворк
1
В соответствии с «список аргументов слишком длинный» ошибки и требует либо bash4 или более поздней версии с globstarопцией оболочки включена, или zsh: rm /**/.DS_Store.
manatwork
1
Вы не делаете ничего специфичного для bash, так что это может быть и sh.
Питер Тейлор
10
Он удалил мой .DS_Storeкаталог, где у меня были важные вещи.
Конрад Боровски,
9

Рубин: 38 33 персонажа

File.delete *Dir['/**/.DS_Store']
manatwork
источник
2
Dir[...]это ярлык для Dir.glob(...), это сэкономит вам 5 символов.
Патрик Осцити
3
Argh! Я знал, что есть более короткий путь, но я искал его Kernel. Спасибо, @padde.
manatwork
2

рыба, 16

rm /**/.DS_Store

(Сделайте это 19, если -fтребуется удалить .DS_Storeв каталогах только для чтения.)

Пьер Карьер
источник
0

Shell, 25

locate .DS_Store|xargs rm

Требуется рабочая locateбаза данных.

Gaelan
источник
3
Также требуются пути без пробельных символов.
manatwork
0

CMD, 17

del/s "/.DS_Store

Довольно просто.

/sтребуется также для поиска в подкаталогах.
"используется для экранирования /символа, который в противном случае был бы интерпретирован как (неверный) аргумент.


источник
-1

найти, 38

Прежнее findрешение совершенно неверно: оно означает удаление всего названного, .DS_Storeвключая каталог, ссылки, специальный файл и т. Д.

Но:

find / -type f -name .DS_Store -delete

это минимальное использование решения find.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Я настоятельно рекомендую не использовать это решение для реального * nix-бокса: попытка рекурсивного удаления чего-либо /- очень плохая идея. Вы предупреждены.

РЕДАКТИРОВАТЬ :

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

РЕДАКТИРОВАТЬ 2 : Еще более актуально: ОП написал: «Код должен удалять только соответствующие файлы .DS_Store и ничего больше». Таким образом, если кто-то хочет прочитать скучные требования, все решения, которые удаляют больше, чем эти файлы, выглядят забавно, умно и т. д. но неправильно .

DavAlPi
источник
Предыдущее findрешение верное. В вопросе говорится «удалите любой файл с именем« .DS_Store »». Таким образом, нет особых требований, основанных на типе файла.
manatwork
@ manatwork: ерунда: файл отличается от каталога. Вдоль вашей витой линии лучшим решением по-прежнему является rm -rf /
DavAlPi
2
Ох, ты не гуглил: en.wikipedia.org/wiki/Everything_is_a_file
Йоханнес Кун
3
Ох, и еще одна вещь: в коде гольф цель состоит в том, чтобы найти самое короткое решение, так что если вы можете сэкономить несколько символов, соблюдая требования в вашу пользу, так и будет. Вы можете сохранить 8 символов, рассматривая все как файл, как это делает Unix. PS: где был сюрприз? В том, что некоторые люди отрицают базовый принцип UNIX?
Йоханнес Кун
1
Теперь я получил лучший ответ , который каждый может понять.
DavAlPi