Я пишу сценарий оболочки, который принимает пути к файлам в качестве входных данных.
По этой причине мне нужно генерировать рекурсивные списки файлов с полными путями. Например, файл bar
имеет путь:
/home/ken/foo/bar
но, насколько я вижу, оба ls
и find
только дают списки относительного пути:
./foo/bar (from the folder ken)
Это кажется очевидным требованием, но я не вижу ничего на страницах find
или ls
man.
Как я могу создать список файлов в оболочке, включая их абсолютные пути?
linux
command-line
absolute-path
ls
кругозор
источник
источник
find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Ответы:
Если вы дадите
find
абсолютный путь для начала, он напечатает абсолютные пути. Например, чтобы найти все файлы .htaccess в текущем каталоге:или если ваша оболочка расширяется
$PWD
до текущего каталога:find
просто добавляет путь, который был указан для относительного пути к файлу из этого пути.Грег Хьюгилл также предложил использовать,
pwd -P
если вы хотите разрешить символические ссылки в вашем текущем каталоге.источник
pwd -P
.ls -d -1 $PWD/**/*
но я думаю, чтоfind $PWD
также работает (протестировано в bash)find $PWD
просто.ls
Колдовство является сложным и громоздким (если вы не псевдонимом его).find
не зависит от расширений глобуса оболочки, поэтому будет работать в любой оболочке.find
Кроме того, он гораздо более гибкий, я могу получить рекурсивный список всех файлов, или, возможно, всех каталогов, или, может быть, я хочу получить список всех файлов XML или всех файлов, измененных за последнюю неделю. Все, что возможно сfind
, но не легко сls
.find "`pwd`" -name .htaccess
из-за пробелов в именах каталоговдает полный абсолютный путь. но если файл является символической ссылкой, вы получите окончательное разрешенное имя.
источник
realpath
вместо этогоbrew install coreutils
, то исполняемый файл будет установлен как/usr/local/opt/coreutils/libexec/gnubin/readlink
Используйте это для dirs ( в bash необходимо использовать
/
after,**
чтобы ограничить его каталогами):это для файлов и каталогов непосредственно в текущем каталоге, чьи имена содержат
.
:это для всего:
Взято отсюда http://www.zsh.org/mla/users/2002/msg00033.html
В bash
**
рекурсивно, если вы включаетеshopt -s globstar
.источник
Ты можешь использовать
в баш
источник
Это выглядит только в текущем каталоге. Он заключает в кавычки "$ PWD", если он содержит пробелы.
источник
Команда:
ls -1 -d "$PWD/"*
Это даст абсолютные пути к файлу, как показано ниже.
источник
Это
$PWD
хороший вариант Мэтью выше. Если вы хотите найти только для печати файлов, вы также можете добавить опцию -type f для поиска только обычных файлов. Другие параметры - "d" только для каталогов и т. Д. Так что в вашем случае это будет (если я хочу искать только файлы с .c ext):или если вы хотите все файлы:
Примечание: Вы не можете сделать псевдоним для вышеуказанной команды, потому что $ PWD автоматически заполняется к вашему домашнему каталогу, когда псевдоним устанавливается bash.
источник
Если вы дадите команде find абсолютный путь, она выдаст результаты с абсолютным путем. Итак, из каталога Кена, если вы наберете:
(вместо относительного пути
find . -name bar -print
)Вы должны получить:
Поэтому, если вы хотите, чтобы
ls -l
и он возвращал абсолютный путь, вы можете просто сказать команде find выполнитьls -l
все, что он находит.ПРИМЕЧАНИЕ. Между
{}
и;
Вы получите что-то вроде этого:
Если вы не уверены, где находится файл, вы всегда можете изменить место поиска. Пока путь поиска начинается с «/», вы получите в ответ абсолютный путь. Если вы ищете место (например, /), в котором вы получите много ошибок об отказе в разрешении, я бы порекомендовал перенаправить стандартную ошибку, чтобы вы могли увидеть результаты поиска:
(
2>
это синтаксис для оболочек Borne и Bash, но он не будет работать с оболочкой C. Она может работать и в других оболочках, но я точно знаю, что она работает в Bourne и Bash).источник
ls
процесс с помощью-exec ls -ld {} +
. (Возможно, вы не хотите-d
иметьls
список содержимого каталога). Или лучше, используйте встроенный поискls
сfind ... name bar -ls
. Кроме того, у вас неправильный синтаксис для одного аргумента в команде: вам нужно заключить точку с запятой в оболочку, так что это так{} \;
.fd
Используя
fd
(альтернативаfind
), используйте следующий синтаксис:Где
.
находится шаблон поиска иfoo
является корневым каталогом.Например , чтобы получить список всех файлов в
etc
рекурсивно, выполните:fd . /etc -a
.источник
Просто альтернатива
точно определить, что
*
расширение оболочки, такбудет делать то же самое (недостаток, который вы не можете использовать
-1
для разделения новыми строками, а не пробелами).источник
-1
для разделения по строкам?источник
Вот пример, который выводит список без дополнительного периода, а также демонстрирует, как искать совпадение файла. Надеюсь это поможет:
источник
Это сработало для меня. Но это не перечислить в алфавитном порядке.
Эта команда перечисляет в алфавитном порядке, а также список скрытых файлов.
источник
stat
Абсолютный путь одного файла:
источник
Вы можете попробовать это.
Вы можете получить путь пресса с помощью
for
цикла иecho
просто безfind
.источник
Если вам нужен список всех файлов в текущем, а также подкаталогах
Если вам нужен список всех файлов только в текущем каталоге
источник
Это даст канонический путь (разрешит символические ссылки):
realpath FILENAME
Если вы хотите канонический путь к самой символической ссылке, то:
realpath -s FILENAME
источник
Большинство, если не все из предложенных методов приводят к путям, которые нельзя использовать непосредственно в какой-либо другой терминальной команде, если путь содержит пробелы. В идеале результаты будут иметь косые черты. Это работает для меня на MacOS:
источник
find / -print
сделаю этоисточник
источник