Ответ 1
Используйте find:
find . -name \*.txt -print
В системах, которые используют GNU find, как и большинство дистрибутивов GNU/Linux, вы можете оставить вне -print.
Это похоже на этот вопрос, но я хочу включить путь относительно текущего каталога в 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
для фильтрации тех, которые вы хотите.
Если команда не найдена, вы можете установить ее:
Введите следующую команду для установки команды дерева на RHEL/CentOS и Fedora linux:
# yum install tree -y
Если вы используете Debian/Ubuntu, Mint Linux введите следующую команду в своем терминале:
$ sudo apt-get install tree -y
Попробуйте find
. Вы можете посмотреть его точно на странице руководства, но это примерно так:
find [start directory] -name [what to find]
поэтому для вашего примера
find . -name "*.txt"
должен предоставить вам то, что вы хотите.
Вместо этого вы можете использовать find:
find . -name '*.txt'
Это делает трюк:
ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"
Но это делает это, "грешая" с анализом ls
, хотя, который считается плохой формой сообществами GNU и Ghostscript.
DIR=your_path
find $DIR | sed 's:""$DIR""::'
'sed' удалит 'ваш_path' из всех результатов поиска. И вы получаете относительно пути DIR.
Чтобы получить фактические имена файлов нужных файлов с помощью команды find, используйте его с командой pwd:
find $(pwd) -name \*.txt -print
Вот Perl script:
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 [email protected]; do
echo $PWD/$i
done
}
Первый будет работать только с отдельными файлами.
Найдите файл с именем "filename" в вашей файловой системе, начиная поиск из корневого каталога "/". "Имя файла"
find / -name "filename"
Если вы хотите сохранить детали в ls, таких как размер файла и т.д., то это должно работать.
sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
Вы можете реализовать эту функциональность, например, это
Во-первых, использование команды ls указывает на целевой каталог. Позже с помощью команды find откройте результат.
Из вашего случая это звучит так: всегда имя файла начинается со слова
file***.txt
ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search)