2015-07-19 4 views
0

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

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

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

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

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

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

+0

Единственное возможное решение, с которым я столкнулся, - это сначала удалить эти файлы, но затем вы потеряете все настройки, которые они содержат. – christian

ответ

0

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

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), как определено в состоянии выше.

+0

Ничего себе, это здорово! Единственная проблема, с которой я столкнулась, - chflags не находит папки, содержащие пробелы. – christian

+0

Это должно решить эту проблему: '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" \ "")}' ' –

+0

Спасибо за помощь! Похоже, что с рекурсией все еще что-то происходит. Если папка содержит другую «пустую» папку, она не считается пустой. – christian

Смежные вопросы