Поскольку вы только обработка ребенок каталогов (непосредственные подкаталоги), петли оболочки может быть более простое решение:
(cd "/path/to/dir" && for d in */; do sudo tar -zcpvf "${d%/}".tar.gz "$d"; done)
Я знаю, что вы хотите избежать cd
, но, включив всю команду в (…)
, она запускается в подклассу , поэтому рабочий каталог текущей оболочки. остается неизменной.
В оставшейся части этого ответа обсуждается, как решить проблему, используя GNU find
.
Решение -execdir
также будет работать с BSD/OSX find
, и на самом деле было бы проще.
Что касается получения find
«ы -printf
только печати в имена файлов, без каких-либо компонентов каталога: используйте формат %f
спецификатор:
find /path/to/dir/* -maxdepth 0 -type d -printf "%f\n"
Это будет печатать простое имена всех непосредственных подкаталогов в указанной директории.
Однако , что вы печать не оказывает никакого влияния на то, что {}
расширяется, когда с помощью -exec
действия: {}
всегда расширяется на пути в соответствие, которая неизменно включает в себя компонент пути, указанному в качестве входных данных.
Однако -execdir
действие может дать вам то, что вы хотите:
он переходит в каталог под рукой перед выполнением указанной команды
расширяется {}
к ./<filename>
- т.е. простое имя файла (в данном случае имя каталога), префикс ./
- и передает его указанной команде.
Таким образом:
find /path/to/dir -mindepth 1 -maxdepth 1 -type d -execdir sudo tar -zcpvf {}.tar.gz {} \;
Caveat: -execdir
только ведет себя так, как описано для файлов, которые являются потомками из входных путей; для самих входных трактов, любопытно, {}
все еще расширяется до входных путей as-is[1] .
Таким образом, команда выше делает не использовать подстановку (/path/to/dir/*
) с -maxdepth 0
, но вместо этого использует /path/to/dir
и позволяет find
сделать перечисление содержащихся элементов, которые, чем на уровне - следовательно -maxdepth 1
; так как сам входной путь не должен быть включен, необходимо добавить -mindepth 1
.
Обратите внимание, что поведение затем немного отличается: find
всегда включает скрытых элементов в перечислении, а оболочечная подстановка (*
) по умолчанию делает не.
Если ./
префикс в {}
разложения должны быть зачищены, требуется дополнительная работа:
find /path/to/dir -mindepth 1 -maxdepth 1 -type d \
-execdir sh -c 'd=${1##*/}; sudo tar -zcpvf "$d".tar.gz "$d"' - {} \;
Вовлечение оболочки (sh
) позволяет отгонки префикс ./
используя расширение параметра оболочки (${1##*/}
будет, по сути, полосой любой компонент пути). Обратите внимание на фиктивный аргумент -
, который оболочка присваивает $0
, что нас здесь не интересует; {}
затем становится параметром оболочки $1
.
[1] С ./
префиксом, если входной путь сам по себе относительно; обратите внимание, что BSD/OSX find
не проявляет эту причуду: он всегда расширяет {}
до . mene filename, без любой компонент пути.
Если ответ решает вашу проблему, пожалуйста, примите его, нажав на большую галочку (✓) рядом с ней. Если вы нашли другие ответы полезными, попробуйте их проголосовать. Приём и голосование помогают будущим читателям. См. [Соответствующую статью справочного центра] (http://stackoverflow.com/help/someone-answers). Если ваш вопрос еще не полностью ответил, пожалуйста, сообщите об этом. – mklement0
См. [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) – zdim