Répertorie les fichiers de manière récursive dans la CLI Linux avec le chemin relatif au répertoire en cours
Question
Ceci est similaire à cette question , mais je veux inclure le chemin relatif au répertoire actuel dans unix. Si je fais ce qui suit:
ls -LR | grep .txt
Cela n'inclut pas les chemins complets. Par exemple, j'ai la structure de répertoire suivante:
test1/file.txt
test2/file1.txt
test2/file2.txt
Le code ci-dessus renverra:
file.txt
file1.txt
file2.txt
Comment puis-je le faire inclure les chemins relatifs au répertoire actuel à l'aide de commandes Unix standard?
La solution
Utiliser find:
find . -name \*.txt -print
Sur les systèmes qui utilisent GNU Find, comme la plupart des distributions GNU / Linux, vous pouvez omettre l’empreinte -print.
Autres conseils
Utilisez arborescence
, avec -f
(chemin complet) et -i
(aucune ligne d'indentation):
tree -if --noreport .
tree -if --noreport directory/
Vous pouvez ensuite utiliser grep
pour filtrer ceux que vous souhaitez.
Si la commande est introuvable, vous pouvez l'installer:
Tapez la commande suivante pour installer la commande arborescente sur RHEL / CentOS et Fedora linux:
# yum install tree -y
Si vous utilisez Debian / Ubuntu, Mint Linux entrez la commande suivante dans votre terminal:
$ sudo apt-get install tree -y
Essayez trouver
. Vous pouvez le rechercher exactement dans la page de manuel, mais c'est un peu comme ceci:
trouver [répertoire de départ] -name [que trouver]
donc pour votre exemple
trouver. -name " *. txt "
devrait vous donner ce que vous voulez.
Vous pouvez utiliser find à la place:
find . -name '*.txt'
Cela fait l'affaire:
ls -R1 $ PWD | en lisant l; fait le cas $ l dans * :) d = $ {l%:} ;; ") d = ;; *) echo "$ d / $ l" ;; esac; fait | grep -i ".txt"
Mais il le fait en " péchant " avec l'analyse de ls
, ce qui est considéré comme une mauvaise forme par les communautés GNU et Ghostscript.
DIR=your_path
find $DIR | sed 's:""$DIR""::'
'sed' effacera 'your_path' de tous les résultats 'trouver'. Et vous recevez par rapport au chemin 'DIR'.
Pour obtenir les noms de fichier de chemin complet des fichiers souhaités à l'aide de la commande find, utilisez-le avec la commande pwd:
find $(pwd) -name \*.txt -print
Voici un script Perl:
sub format_lines($)
{
my $refonlines = shift;
my @lines = @{$refonlines};
my $tmppath = "-";
foreach (@lines)
{
next if ( Voici un script Perl:
ls -LR | perl format_ls-LR.pl
utilisation:
<*> =~ /^\s+/);
if ( Voici un script Perl:
<*>
utilisation:
<*> =~ /(^\w+(\/\w*)*):/)
{
$tmppath = $1 if defined $1;
next;
}
print "$tmppath/ Voici un script Perl:
<*>
utilisation:
<*>";
}
}
sub main()
{
my @lines = ();
while (<>)
{
push (@lines, Voici un script Perl:
<*>
utilisation:
<*>);
}
format_lines(\@lines);
}
main();
utilisation:
<*> Vous pouvez créer une fonction shell, par exemple dans votre .zshrc
ou .bashrc
:
filepath() {
echo $PWD/$1
}
filepath2() {
for i in $@; do
echo $PWD/$i
done
}
Le premier ne fonctionnerait évidemment que sur des fichiers uniques.
Recherchez le fichier appelé "nom de fichier". sur votre système de fichiers en commençant la recherche à partir du répertoire racine "/". Le " nom de fichier "
find / -name "filename"
Si vous souhaitez conserver les détails fournis avec la taille de fichier, etc., comme ls, dans votre sortie, cela devrait fonctionner.
sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
Vous pouvez implémenter cette fonctionnalité comme ceci
Premièrement, l’utilisation de la commande ls a indiqué le répertoire ciblé. Plus tard, en utilisant la commande find filtrer le résultat.
De votre cas, cela ressemble à - toujours le nom du fichier commence par un mot
fichier ***. txt
ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search)
Dans le poisson shell, vous pouvez le faire pour répertorier tous les pdfs de manière récursive, y compris ceux du répertoire en cours. :
$ ls **pdf
Supprimez simplement 'pdf' si vous voulez des fichiers de n'importe quel type.