Рекурсивно выводить список файлов в Linux CLI с указанием пути относительно текущего каталога.
Вопрос
Это похоже на этот вопрос, но я хочу включить путь относительно текущего каталога в unix.Если я сделаю следующее:
ls -LR | grep .txt
Он не включает полные пути.Например, у меня есть следующая структура каталогов:
test1/file.txt
test2/file1.txt
test2/file2.txt
Код выше вернет:
file.txt
file1.txt
file2.txt
Как я могу заставить его включать пути относительно текущего каталога, используя стандартные команды Unix?
Решение
Используйте find:
find . -name \*.txt -print
В системах, использующих GNU find, как и в большинстве дистрибутивов GNU / Linux, вы можете не указывать -print.
Другие советы
Используйте tree
, с -f
(полный путь) и -i
(без строк отступа):
tree -if --noreport .
tree -if --noreport directory/
Затем вы можете использовать grep
, чтобы отфильтровать те, которые вам нужны.
Если команда не найдена, вы можете установить ее:
Введите следующую команду, чтобы установить команду дерева в Linux RHEL / CentOS и Fedora:
# yum install tree -y
Если вы используете Debian / Ubuntu, введите в свой терминал Mint Linux следующую команду:
$ sudo apt-get install tree -y
Попробуйте найти
. Вы можете найти это точно на странице руководства, но это как-то так:
find [начальный каталог] -name [что найти]
так для вашего примера
найти. -name " *. txt "
должен дать вам то, что вы хотите.
Вместо этого вы можете использовать find:
find . -name '*.txt'
Это делает трюк:
ls -R1 $ PWD | пока читаю л; сделать регистр $ l в * :) d = $ {l%:} ;; ") d = ;; *) echo "$ d / $ l" ;; ESAC; сделано | grep -i " .txt "
Но это происходит с помощью "греха" однако, с помощью анализа ls
, что считается сообществом GNU и Ghostscript дурным тоном.
DIR=your_path
find $DIR | sed 's:""$DIR""::'
'sed' сотрет 'your_path' со всех результатов 'find'. И вы получите относительно пути 'DIR'.
Чтобы получить действительные полные имена файлов нужных файлов с помощью команды find, используйте ее с командой pwd:
find $(pwd) -name \*.txt -print
Вот Perl-скрипт:
sub format_lines($)
{
my $refonlines = shift;
my @lines = @{$refonlines};
my $tmppath = "-";
foreach (@lines)
{
next if ($_ =~ /^\s+/);
if ($_ =~ /(^\w+(\/\w*)*):/)
{
$tmppath = $1 if defined $1;
next;
}
print "$tmppath/$_";
}
}
sub main()
{
my @lines = ();
while (<>)
{
push (@lines, $_);
}
format_lines(\@lines);
}
main();
Применение:
ls -LR | perl format_ls-LR.pl
Вы можете создать функцию оболочки, например, в вашем .zshrc
или .bashrc
:
filepath() {
echo $PWD/$1
}
filepath2() {
for i in $@; do
echo $PWD/$i
done
}
Первый, очевидно, будет работать только с отдельными файлами.
Найдите файл с именем " имя файла " В вашей файловой системе поиск начинается с корневого каталога " / " ;. & Quot; имя файла " Р>
find / -name "filename"
Если вы хотите сохранить в выводе данные, например ls, такие как размер файла и т. д., это должно сработать.
sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
Вы можете реализовать эту функцию, как это
Во-первых, команда ls указала на целевой каталог. Позже с помощью команды find отфильтруйте результат.
С вашего случая это звучит так - всегда имя файла начинается со слова
<Код> файл ***. TXT код>
ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search)
В оболочке fish вы можете сделать это для рекурсивного вывода списка всех PDF-файлов, включая файлы в текущем каталоге.
$ ls **pdf
Просто удалите «pdf», если вы хотите файлы любого типа. Р>