Есть ли простой способ распечатать полный путь к 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"
- Затем мы получаем dirname часть этого пути (вы можете передать этому скрипту либо каталог, либо файл):
dirname "$ 1"
- Затем мы
cd "$ (dirname" $ 1 ")
в этот относительный каталог && pwd -P
и получите для него абсолютный путь. Параметр # code> -P позволит избежать всех символических ссылок- После этого мы добавляем basename к абсолютному пути:
$ (basename "$ 1")
- В качестве последнего шага мы
эхо
его
Вы можете сохранить это в своем 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 выполните следующие действия:
cd
в каталог целевого файла.- Введите любую из следующих команд терминала.
Терминал
ls "` pwd`/file. txt "echo $ (pwd)/file.txt
- Замените
file.txt
фактическим именем файла. - Нажмите , введите
как получить полный путь к открытому файлу
У меня есть сценарий, который запускается на сервере 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
мне не нужно устанавливать стороннее программное обеспечение, когда мы переносим сценарий на новый сервер. Решения, решения …