Рекурсивно скрывать пустые папки, игнорируя .DS_Store и т. д.

Я пытаюсь написать сценарий bash, чтобы рекурсивно скрывать пустые папки в текущем каталоге.

В конечном итоге это будет использоваться как часть рабочего процесса Alfred, что позволит мне скрывать/показывать дополнительные папки в иерархии папок моего проекта по умолчанию. Цель состоит в том, чтобы сохранить свое здравомыслие при повторном знакомстве с проектом, но сохранить структуру папок на месте, чтобы я мог сохранять согласованность от проекта к проекту.

Я экспериментировал с этой командой терминала

find . -empty -type d -exec chflags hidden {} +

Теоретически это работает, но проблема в том, что Mac OS X добавляет системные файлы в папки, которые я считаю пустыми для своих целей.

Как я могу игнорировать такие файлы, как .DS_Store, при скрытии каталогов?


person christian    schedule 19.07.2015    source источник
comment
Единственное возможное решение, которое я придумал, — сначала удалить эти файлы, но тогда вы потеряете все содержащиеся в них настройки.   -  person christian    schedule 19.07.2015


Ответы (1)


Вы можете сделать:

find . -type d -exec bash -c "echo -ne '{}\t'; ls -a1 '{}' | wc -l" \; |   awk -F"\t" '$NF<=3{ system("chflags hidden " $1 ) }'

Где $NF‹=3 означает скрытие всех папок, содержащих 3 или менее элементов внутри, обычно это будет так:

. 
..
.DS_Store

Вы, конечно, можете заменить эту часть чем-то более сложным, но вы должны уловить идею.

Или вы можете уточнить поиск, чтобы исключить определенные файлы с помощью grep, например.

find . -type d -exec bash -c "echo -ne '{}\t'; ls -a1 '{}' | egrep -v  '^\.(\.?|DS_Store)$' | wc -l" \; |   awk -F"\t" '$NF<=0{ system("chflags hidden " $1 ) }'

Это скроет папки только в том случае, если ls не вернет ничего, кроме одного или нескольких из (./../.DS_Store), как определено в приведенном выше условии.

person D.K.    schedule 19.07.2015
comment
Ух ты, здорово! Единственная проблема, с которой я сталкиваюсь, это то, что chflags не может найти папки, содержащие пробелы. - person christian; 19.07.2015
comment
Это должно решить эту проблему: find . -type d -exec bash -c "echo -ne '{}\t'; ls -a1 '{}' | egrep -v '^\.(\.?|DS_Store)$' | wc -l" \; | awk -F"\t" '$NF<=0{ system("chflags hidden \"" $1 "\"" ) }' - person D.K.; 19.07.2015
comment
Спасибо за помощь! Похоже, с рекурсией все еще что-то происходит. Если папка содержит другую пустую папку, она не считается пустой. - person christian; 19.07.2015
comment
Я думал, что под рекурсией вы подразумеваете скрытие пустых папок с текущего уровня вниз, а не скрытие папок с пустыми подпапками. Это также должно скрыть папки с пустыми подпапками: find . -type d -exec bash -c "echo -ne '{}\t'; ls -al '{}' | tr -s ' ' | cut -d' ' -f1,9-255 | egrep -v '(^.{10}@.*|^(total|.{11}\.(\.?|DS_Store))$)' | wc -l" \; | awk -F"\t" '$NF<=0{ system("chflags hidden \"" $1 "\"") }' Возможно, вам придется запустить команду несколько раз, чтобы получить всю структуру прямо... - person D.K.; 19.07.2015
comment
Извините за путаницу. По сути, я хочу скрыть любые структуры папок, которые не содержат файлов. Это включает в себя пустые папки. Я обновлю вопрос, чтобы быть более ясным. - person christian; 19.07.2015
comment
Да, я понял позже. Это то, что должен делать код, включенный в мой последний комментарий. - person D.K.; 19.07.2015
comment
Давайте продолжим это обсуждение в чате. - person christian; 19.07.2015