Как получить текущий путь без последней папки в скрипте?

Мне нравится делать примерно следующее:

#!/bin/sh
for i in filename_*.txt; do echo "$i"; done |
sed "s/filename_\([0-9]*\)\([0-9]\{3\}\)\.txt/mv -i 'filename_\1\2.txt' '\2_filename_\1\2.txt'/g"

Это выводит список команд mv для выполнения задачи. Если он выводит правильные команды, то просто добавьте | sh в конце команды sed, чтобы заставить оболочку выполнить их.

Этот сценарий использует команду замены sed s и функцию обратной ссылки для использования частей совпавшего регулярного выражения в строке замены.

s/regex/replacement/

Части шаблона регулярного выражения между \( и \) могут быть использованы в строке замены по \N, где in - число.

1
15.08.2018, 12:00
5 ответов

Текущий рабочий каталог, т.е. :/home/dev/other

dir=$PWD

Родительский каталог

parentdir="$(dirname "$dir")"`
-1
27.01.2020, 23:23

Вzsh:

dir=$PWD:h

Подобно dirname, это удаляет один компонент каталога с конца $PWD. Когда $PWDравно /, $dirстановится /подобно dirname.

Одно преимущество перед

dir=$(dirname -- "$PWD")

заключается в том, что он все еще работает, если имя каталога $PWDзаканчивается символами новой строки.

Обратите внимание, что это не обязательно родительский каталог для текущего каталога. Например, если $PWDравно /tmp, а /tmpявляется символической ссылкой на /var/tmp, родительским каталогом текущего каталога будет /var, а не /. Чтобы получить родительский каталог, вы можете сделать:

dir=$PWD/..
dir=$dir:P

или:

dir=$PWD:P:h

(модификатор :Pделает $dirканоническим путем (разрешает все символические ссылки, .и ..компоненты, такие как GNUreadlink -f)).

Или POSIXly:

dir=$(cd -P.. && pwd -P)

В любом случае обратите внимание, что $PWDвнутри скрипта не имеет ничего общего с путем к скрипту. Если вам нужен родительский каталог каталога, содержащего скрипт, это будет $0:P:h:hв zsh.

1
27.01.2020, 23:23

попробуйте следующий код,

dirname "$(pwd)"
  • имя каталога -удалить суффикс из пути к файлу/каталогу
2
27.01.2020, 23:23

Вы можете использовать

dir=${PWD%/*}    # or:  dir=$( dirname "$PWD" )

или

dir="$PWD/.."

или

dir=".."

В первом случае переменная PWD, содержащая текущий рабочий каталог, используется для получения пути к каталогу на один уровень выше путем удаления последнего /и всего, что следует за ним.

Во втором случае переменная PWDиспользуется для простого создания пути к указанному выше каталогу с помощью ...

В третьем случае мы просто обращаемся к указанному выше каталогу, используя относительный путь от текущего каталога.

Выбор альтернативы зависит от того, для чего вы собираетесь использовать путь.

Примеры:

$ echo $PWD
/tmp/shell-sh.jAtMYgn0
$ dir=${PWD%/*}
$ echo "$dir"
/tmp
$ dir="$PWD/.."
$ echo "$dir"
/tmp/shell-sh.jAtMYgn0/..
$ dir=".."
$ echo "$dir"
..
4
27.01.2020, 23:23

Наконец, это было так же просто, как:current=$(dirname "$(pwd)")

-1
27.01.2020, 23:23

Теги

Похожие вопросы