Ceci est similaire à cette question , mais je veux inclure le chemin relatif au répertoire actuel sous 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 retournera:
file.txt
file1.txt
file2.txt
Comment puis-je l'obtenir pour inclure les chemins relatifs au répertoire actuel à l'aide de commandes Unix standard?
Utilisez find:
find . -name \*.txt -print
Sur les systèmes qui utilisent GNU find, comme la plupart des distributions GNU/Linux, vous pouvez omettre le caractère print.
Utilisez tree
, avec -f
(chemin complet) et -i
(pas de lignes d'indentation):
tree -if --noreport .
tree -if --noreport directory/
Vous pouvez ensuite utiliser grep
pour filtrer ceux que vous voulez.
Si la commande est introuvable, vous pouvez l'installer:
Tapez la commande suivante pour installer la commande tree 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 find
. Vous pouvez le rechercher exactement dans la page de manuel, mais c'est un peu comme ceci:
find [start directory] -name [what to find]
donc pour votre exemple
find . -name "*.txt"
devrait vous donner ce que vous voulez.
Vous pouvez utiliser find à la place:
find . -name '*.txt'
Cela fait le tour:
ls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"
Mais il le fait en "péchant" avec l'analyse syntaxique 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
Recherchez le fichier appelé "nom de fichier" sur votre système de fichiers en démarrant la recherche à partir du répertoire racine "/". Le "nom de fichier"
find / -name "filename"
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 que sur des fichiers uniques, évidemment.
Voici un script 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();
usage:
ls -LR | Perl format_ls-LR.pl
Dans le shell poisson , vous pouvez le faire pour répertorier tous les fichiers PDF de manière récursive, y compris ceux du répertoire en cours:
$ ls **pdf
Supprimez simplement 'pdf' si vous voulez des fichiers de tout type.
Si vous souhaitez conserver les détails fournis avec ls, tels que la taille du fichier, etc. 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. Cela ressemble à votre cas - le nom du fichier commence toujours par Word file***.txt
ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search)