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

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

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

  dir>  file.txt  

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

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

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

  readlink -f file.txt  

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

Я обнаружил в coreutils 8.15 утилиту realpath .

  realpath file.txt/data/ail_data/transformed_binaries/ coreutils/test_folder_realpath/file.txt  

Согласно комментариям @ styrofoam-fly и @ arch-standton, только realpath не проверяет наличие файла существования, чтобы решить эту проблему, добавьте аргумент e : realpath -e file

5


Обычно помогает следующее:

  echo "$ (cd" $ (dirname "$ 1") "&& pwd -P)/$ (basename" $ ​​1 ")"  

6


Я знаю , что есть более простой способ, но черт возьми, если я найду его …

  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  

1


  find $ PWD -type f |  grep "filename"  

или

  find $ PWD -type f -name "* filename *"  

2


В Windows:

  • Удерживая Shift и щелкнув правой кнопкой мыши файл в проводнике Windows, вы получите параметр Копировать как путь . Это скопирует полный путь к файлу в буфер обмена.

В Linux:

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

0


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

  ls "` pwd`/file.txt " 

Замените file.txt на ваше целевое имя файла.

1


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

 % pwd/Users/adamatan/bins/scripts/fpn% lsLICENSE 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


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

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

  $ which ls/bin/ls  

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

1


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

Это даст вам CSV в кавычках для всех файлов в текущем каталоге:

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

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

2


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

  abspath () {old = `pwd`; new = $  (dirname "$ 1"); if ["$ new"! = "."  ];  затем cd $ new;  fi; file = `pwd`/$ (базовое имя" $ 1 "); cd $ old; echo $ file;  }  

Использование:

  $ abspath file.txt/I/am/in/present/dir/file.txt  

Использование с относительным путем:

  $ abspath ../../some/dir/some-file.txt/I /am/in/some/dir/some-file.txt

С пробелами в имени файла:

  $ abspath "  ../../some/dir/another file.txt "/I/am/in/some/dir/another file.txt  


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

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

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

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

1


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

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

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

NB: команды readlink -f и realpath должны работать из коробки для пользователей Unix, отличных от Mac.

1


  echo $ (cd $ (dirname "$ 1") && pwd -P)/$ (basename "$ 1")  

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

  1. Этот скрипт получает относительный путь в качестве аргумента "$1"
  2. Затем мы получаем dirname часть этого пути (вы можете передать этому скрипту либо каталог, либо файл): dirname "$ 1"
  3. Затем мы cd "$ (dirname" $ ​​1 ") в этот относительный каталог
  4. && pwd -P и получите для него абсолютный путь. Параметр # code> -P позволит избежать всех символических ссылок
  5. После этого мы добавляем basename к абсолютному пути: $ (basename "$ 1")
  6. В качестве последнего шага мы эхо его

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

  function absolute_path {echo "$  PWD/$ 1 ";  } alias ap = "absolute_path"  

пример:

  ap somefile.txt  

выведет

 /home/user/somefile.txt  

2


У меня это сработало очень хорошо. Он не полагается на файловую систему (за/против в зависимости от необходимости), поэтому будет быстро; и он должен быть переносимым на любой * NIX. Предполагается, что переданная строка действительно относится к PWD, а не к какому-либо другому каталогу.

  function abspath () {echo $ 1 |  awk ' # Корневой родительский каталог ссылается на PWD для замены ниже/^..//{sub ("^", "./")}  # Замените символические ссылки PWD на абсолютные PWD /^.//{sub (" ^ . ", ENVIRON [" PWD "])}  # Вывести абсолютные пути /^ //{print}  '}  


Это наивно, но мне пришлось сделать его совместимым с POSIX. Требуется разрешение на cd в каталог файла.

  #!/bin/ shift [$ {#} = 0]; then echo "Ошибка: 0 аргументов.  нужно 1 "> & 2 exit 1fiif [-d $ {1}]; then # Directory base = $ (cd $ {1}; echo $ {PWD ## */}) dir = $ (cd $ {1}; echo  $ {PWD% $ {base}}) if [$ {dir} =/]; then parentPath = $ {dir} else parentPath = $ {dir%/} fi if [-z $ {base}] || [-  z $ {parentPath}]; then if [-n $ {1}]; then fullPath = $ (cd $ {1}; echo $ {PWD}) else echo "Ошибка: неподдерживаемый сценарий 1"> & 2 exit 1 fi fielif  [$ {1%/*} = $ {1}]; then if [-f ./${1}]; then # Файл в текущем каталоге base = $ (echo $ {1 ## */}) parentPath =  $ (echo $ {PWD}) else echo "Ошибка: неподдерживаемый сценарий 2"> & 2 exit 1 fielif [-f $ {1}] && [-d $ {1%/*}]; then # Файл в каталоге base =  $ (echo $ {1 ## */}) parentPath = $ (cd $ {1%/*}; echo $ {PWD}) else echo "Ошибка: не файл или каталог"> & 2 exit 1fiif [$ {parentPath}  =/]; затем fullPath = $ {fullPath: - $ {parentPath} $ {base}} fifullPath = $ {fullPath: - $ {parentPath}/$ {base}} if [! -e $ {fullPath}]; тогда  echo "Ошибка: не существует"> & 2 exit 1fiecho $ {fullPath}  

iv>


  find/-samefile file.txt -print  

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

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

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

  find/bin -samefile/bin/gunzip -ls  

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

  12845178 4 -rwxr-xr-x 2 root root 2251 9 фев 2012/bin/uncompress12845178 4 -rwxr-xr-x 2 root root 2251 9 feb 2012/bin/gunzip  


Обычно:

  find `pwd` |  grep  

В качестве альтернативы, только для текущей папки:

  найти `pwd` -maxdepth 1 |  grep  

1


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

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

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

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

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

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

Дэйв


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

  getAbsolutePath () {[[-d $ 1]] && {cd "$ 1";  эхо "$ (pwd -P)";  } ||  {cd "$ (dirname" $ ​​1 ")" ||  выход 1;  echo "$ (pwd -P)/$ (базовое имя" $ 1 ")";  }}  


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

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


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

  fname   


Для Mac OS, если вы просто хотите получить путь к файлу в поисковике, щелкните файл и прокрутите вниз до пункта «Службы» внизу. У вас есть много вариантов, включая «копировать путь» и «копировать полный путь». Щелчок по одному из них помещает путь в буфер обмена..


  fp () {PHYS_DIR = `pwd  -P`RESULT = $ PHYS_DIR/$ 1echo $ RESULT |  pbcopyecho $ RESULT}  

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

🙂

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


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

  для i в `ls`;  do echo "` pwd`/$ i ";  готово  

у меня хорошо работает


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

  1. cd в каталог целевого файла.
  2. Введите любую из следующих команд терминала.

Терминал

  ls "` pwd`/file.  txt "echo $ (pwd)/file.txt  
  1. Замените file.txt фактическим именем файла.
  2. Нажмите , введите



как получить полный путь к открытому файлу

У меня есть сценарий, который запускается на сервере Windows для выполнения операций с определенными файлами. Сценарий часто дает сбой, потому что у разных пользователей (даже у меня) есть открытые общие файловые ресурсы на сервере, которые они забыли закрыть, поэтому папки заблокированы.

Я добавил код для проверки открытия файлы с помощью net file и закройте их, если они соответствуют определенным шаблонам. Ограничение заключается в том, что net file суммирует путь к открытым файлам, например,

  ID Path Имя пользователя # Locks -----  --------------------------------------------------  ------------------------ 2 C:  Program Files  ...  cocoon-2.1.11  huttarl 0  

, когда полный путь к открытому файлу —

  C:  Program Files  Apache Software Foundation  cocoon-2.1.11  

Поэтому, когда мой сценарий проверяет соответствие пути к файлу определенному шаблону, например «Apache», он иногда пропускает файлы, в середине которых есть ... сетевой файл листинг.

Итак, мой вопрос: как я могу получить полный путь к открытому файлу в скрипте?

В настоящее время я использую cygwin/bash. Так что, если мне придется перейти на WSH, мне придется кое-что портировать. Но если это единственный вариант, я сделаю это.

Если это важно, на панели системной информации указано, что моя версия Windows — Windows Server Standard, (c) 2007, SP2.


Я нашел следующее полезным:

openfiles/query/v | findstr "строка, которую вы хотите"


Вам следует использовать PsFile

Об этом

Команда «net file» показывает вам список файлов, которые другие компьютеры открылись в системе, в которой вы выполняете команду, однако она обрезает длинные имена путей и не позволяет вам видеть эту информацию для удаленных систем. PsFile — это утилита командной строки, которая показывает список файлов в системе, которые открываются удаленно, а также позволяет закрывать открытые файлы по имени или по идентификатору файла.

1


А … похоже, я нашел это год или больше назад.

Оказывается, если вы дадите net file идентификатор открытого файла, он выведет полный путь.

Итак, для моего примера в вопросе, если Я набрал

  C: > net file 2  

Я бы получил

  Идентификатор файла 2 Имя пользователя huttarlLocks 0 Путь C:  Program Files  Apache Software Foundation  cocoon-2.1.11  Permissions (none) Команда успешно выполнена.  

Использование этой функции означало бы

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

Тогда как с PSFile я мог бы сделать все это с помощью одной простой команды. Но с net use мне не нужно устанавливать стороннее программное обеспечение, когда мы переносим сценарий на новый сервер. Решения, решения …

Оцените статью
clickpad.ru
Добавить комментарий