Как получить полный путь к файлу?

442

Есть ли простой способ распечатать полный путь file.txt?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

<command>

dir> <command> file.txt  

должен печатать

/nfs/an/disks/jj/home/dir/file.txt
  • 0
    Что насчет myfile или ./myfile
Теги:
file
path

27 ответов

691
Лучший ответ

Используйте readlink:

readlink -f file.txt
  • 0
    Я предполагаю, что это работает только для символических ссылок. <br> Использование: readlink FILE Если FILE существует и является символической ссылкой, распечатайте содержимое ссылки и успешно завершите работу. В противном случае ничего не печатать и не получится. --help отобразить эту справку и выйти --version вывести информацию о версии и выйти
  • 22
    Вот для чего -f.
Показать ещё 12 комментариев
100

Я полагаю, вы используете Linux.

Я нашел утилиту под названием realpath в coreutils 8.15.

realpath realpath
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/realpath
  • 0
    Работает с Cygwin (с Mintty 2.7.9)
  • 0
    realpath был посвящен репо coreutils в конце 2011 года, выпуск 8.15 был сделан в январе 2012 года, я ответил на вопрос (с предложением readlink ) в марте 2011 года :)
Показать ещё 2 комментария
51

Следующее обычно выполняет трюк:

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
  • 0
    Привет. Я нашел этот ответ лучше всего на мое требование. Можете ли вы объяснить, как я могу использовать локальную переменную вместо параметра командной строки (например, $ 1)
  • 1
    LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
Показать ещё 5 комментариев
20

Я знаю, что проще, чем это, но штопает, если я могу найти его...

jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav

jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
12
find $PWD -type f | grep "filename"

или

find $PWD -type f -name "*filename*"
  • 1
    Для меня на Mac это сработало - вместо $ pwd - find `pwd` -type file -name \*.dmp
  • 0
    Это именно то, что мне было нужно, спасибо!
2

Если вы находитесь в том же каталоге, что и файл:

ls "`pwd`/file.txt"

Замените file.txt целевым именем файла.

  • 8
    Вы также можете сделать echo $(pwd)/file.txt
2

Вы можете использовать fpn (полное имя пути) script:

% pwd
/Users/adamatan/bins/scripts/fpn

% ls
LICENSE   README.md fpn.py

% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py

fpn не является стандартным пакетом Linux, но свободный и открытый проект github, и вы может установить его через минуту.

  • 1
    Как правило, pwd должен нормально работать в Linux и большинстве других Unix-подобных ОС.
1

В окнах вы можете

Hold shift and right click on a file which gives you can option called "Copy as Path"

Это скопирует полный путь файла в буфер обмена.

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

realpath yourfile, чтобы получить полный путь к файлу, как это было предложено многими.

1

В Mac OS X я заменил утилиты, поставляемые с операционной системой, и заменил их более новой версией ядра. Это позволяет вам получить доступ к таким инструментам, как readlink -f (для абсолютного пути к файлам) и realpath (абсолютный путь к каталогам) на вашем Mac.

Версия Homebrew добавляет "G" (для инструментов GNU) перед именем команды, поэтому эквиваленты становятся greadlink -f FILE и grealpath DIRECTORY.

Инструкции по установке инструментов coreutils/GNU на Mac OS X через Homebrew можно найти в этой статье StackExchange.

Примечание. Команды readlink -f и realpath должны работать в автономном режиме для пользователей, не являющихся пользователями Mac Unix.

  • 2
    brew install coreutils
1

В аналогичном сценарии я запускаю cshell script из другого места. Для установки правильного абсолютного пути script, чтобы он выполнялся только в указанной директории, я использую следующий код:

set script_dir = `pwd`/`dirname $0`

$0 хранит точную строку, как был выполнен script.

Например, если script был запущен следующим образом: $> ../../test/test.csh, $script_dir будет содержать /home/abc/sandbox/v1/../../test

  • 0
    за это проголосовали, так как это самый простой и актуальный вариант. Однако, если вы ./test.csh вас будет путь, заканчивающийся на /test/.
0

Работает на Mac, Linux, * nix:

Это даст вам цитату из всех файлов в текущем каталоге:

ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'

Результат этого может быть легко скопирован в список python или любую подобную структуру данных.

  • 0
    печатает текущий путь pwd
  • 0
    Да, разделенные запятыми полные пути для всех файлов в pwd, для файла просто выполните ls 'filename' вместо просто 'ls'.
0

Я знаю, что это старый вопрос сейчас, но просто чтобы добавить сюда информацию:

Команду Linux which можно использовать для поиска пути к файлу команды, т.е.

$ which ls
/bin/ls

Есть несколько предостережений; см. https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/.

  • 3
    Этот ответ слишком конкретен, OP не о поиске команд.
0
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

Это объяснение того, что происходит в @ZeRemz answer:

  • Этот script получает относительный путь как аргумент "$1"
  • Затем мы получаем часть dirname этого пути (вы можете передать либо dir или файл в этот script): dirname "$1"
  • Тогда we cd "$(dirname "$1") в этот относительный dir
  • && pwd -P и получить абсолютный путь для него. -P опция избегает всех символических ссылок
  • После этого мы добавляем базовое имя к абсолютному пути: $(basename "$1")
  • В качестве последнего шага мы echo it
0
find / -samefile file.txt -print

Найдите все ссылки на файл с тем же номером inode, что и file.txt

добавление флага -xdev позволит избежать find пересекать границы устройств ( "точки монтирования" ). (Но это, вероятно, ничего не может найти, если find не запускается в каталоге на том же устройстве, что и file.txt)

Обратите внимание, что find может сообщать о нескольких путях для одного объекта файловой системы, потому что Inode может быть связан более чем с одной записью каталога, возможно, даже с использованием разных имен. Например:

find /bin -samefile /bin/gunzip -ls

Будет выводиться:

12845178    4 -rwxr-xr-x   2 root     root         2251 feb  9  2012 /bin/uncompress
12845178    4 -rwxr-xr-x   2 root     root         2251 feb  9  2012 /bin/gunzip
0

Вы можете сохранить это в своем "shell.rc" или просто положить в консоль

function absolute_path {echo "$ PWD/$1"; }

alias ap = "absolute_path"

пример:

ap somefile.txt

выводит

/home/user/somefile.txt

  • 3
    Но тогда ap ../foobar.txt выдаст /home/user/../foobar.txt , что не совсем то, что вы хотите.
  • 2
    Также ap /tmp/foobar.txt выдаст /home/user//tmp/foobar.txt , что неверно.
-1

В Mac OSX выполните следующие действия:

  • cd в каталог целевого файла.
  • Введите одну из следующих команд терминала.
Терминал
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. Замените file.txt своим фактическим именем файла.
  2. Нажмите Enter
-1

Это будет работать как для файла, так и для папки:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
-1
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

Копирует текст в буфер обмена и отображает текст в окне терминала.

:)

(Я скопировал часть кода из другого ответа, но больше не могу найти ответ)

-1

Помимо "readlink -f", другая обычно используемая команда:

$find  /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile
/the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile
$

Это также дает полный путь и имя файла на консоли

Вне темы: этот метод просто дает относительные ссылки, а не абсолютные. Команда readlink -f является правильной.

  • 3
    Этот способ работает, если вы передаете "абсолютный путь" программе поиска ...
-2

Для Mac OS, если вы просто хотите получить путь к файлу в поисковом элементе, нажмите "Файл" и прокрутите вниз до "Услуги" внизу. Вы получаете много вариантов, включая "путь копирования" и "скопировать полный путь". Нажатие на один из них помещает путь в буфер обмена.

-2

Другая утилита Linux, которая выполняет эту работу:

fname <file>
-2

Это работает как с Linux, так и с Mac OSX..

 echo $(pwd)$/$(ls file.txt)
-2

ниже печатается абсолютный путь файла file.txt, который в этом примере должен находиться в текущем каталоге.

find file.txt

Предположим, что file.txt находится в домашнем каталоге пользователя foo. Все приведенные ниже команды эквивалентны, и все они вернут тот же файл /home/foo/file.txt в Linux или /Users/foo/file.txt в OS X:

find ~/file.txt
cd ~/
find file.txt
find ./file.txt
-2

Мне нравятся многие ответы, которые уже были даны, но я нашел это действительно полезным, особенно в script, чтобы получить полный путь к файлу, включая следующие символические ссылки и относительные ссылки, такие как . и ..

dirname `readlink -e relative/path/to/file`

который вернет полный путь к file с корневого пути вперед. Это можно использовать в script, чтобы script знал, к какому пути он запускается, что полезно в клон-хранилище, который может быть расположен где угодно на машине.

basePath=`dirname \`readlink -e $0\``

Затем я могу использовать переменную ${basePath} в моих скриптах, чтобы напрямую ссылаться на другие сценарии.

Надеюсь, что это поможет,

Dave

-2

Обычно:

find `pwd` | grep <filename>

Альтернативно, только для текущей папки:

find `pwd` -maxdepth 1 | grep <filename>
  • 0
    хм, почему ненавижу?
-2

Самый простой способ, который я нашел, -

for i in `ls`; do echo "`pwd`/$i"; done

это хорошо работает для меня

-7

Это даст вам абсолютный путь к файлу:

find / -name file.txt 
  • 5
    Нет, он даст абсолютный путь к каждому файлу в файловой системе с таким же именем и займет много времени для запуска.
  • 1
    @ Дестан, который иногда полезен? Не совсем уверен, почему ответ этого человека так низок, тем более что он 1) отвечает на вопрос 2) не нарушает ни одного из требований автора и 3) работает в том случае, если вы не находитесь в текущем рабочем каталоге файла , «Это должно вернуть только ОДИН ФАЙЛ» не было в требованиях спрашивающего. Почему вы предполагаете, что это будет? Оказывается, этот вопрос возник, когда я хотел указать полный путь к файлу в другом рабочем каталоге, и этот ответ делает то, что я хочу. Я уверен, что были такие, как я.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню