В Bash, если VAR="/home/me/mydir/file.c"
как получить "/home/me/mydir"
?
400
dirname
и basename
инструменты, которые вы ищете для извлечения компонентов пути:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Они не внутренние команды Bash , но они являются частью стандарта POSIX (см dirname
, basename
) , и поэтому должны быть доступны на подавляющем большинстве систем , которые будут под управлением Bash.
Чтобы избежать зависимости от
basename
иdirname
источник
На заметку, если у вас есть только имя файла или относительный путь, само
dirname
по себе не поможет. Для меня ответ в итоге оказалсяreadlink
.Затем вы можете объединить два, чтобы получить только каталог.
источник
readlink -m "$fname"
чтобыЕсли вы хотите, чтобы целевые файлы были символической ссылкой, сначала вы можете проверить их и получить оригинальный файл. Условие if ниже может помочь вам.
источник
Я играл с этим и придумал альтернативу.
Часть, которая мне понравилась, это было легко расширить резервную копию дерева:
источник
Вот скрипт, который я использовал для рекурсивной обрезки. Замените $ 1 на каталог, который вы хотите, конечно.
источник
Сначала я заменил
/
на пустое место (). Затем я удалил все символы перед пустым пробелом (
). В конце я удалил первый символ, который является пустым пространством (
).
источник
где вы получите полный путь с new_path =
$(dirname ${BASH_SOURCE[0]})
. Вы изменяете текущий каталог с помощьюcd
new_path и затем запускаете,pwd
чтобы получить полный путь к текущему каталогу.источник