Listar archivos recursivamente en la CLI de Linux con la ruta relativa al directorio actual
Pregunta
Esto es similar a esta pregunta , pero quiero incluir la ruta relativa al directorio actual en Unix. Si hago lo siguiente:
ls -LR | grep .txt
No incluye las rutas completas. Por ejemplo, tengo la siguiente estructura de directorios:
test1/file.txt
test2/file1.txt
test2/file2.txt
El código anterior devolverá:
file.txt
file1.txt
file2.txt
¿Cómo puedo hacer que incluya las rutas relativas al directorio actual usando los comandos estándar de Unix?
Solución
Use find:
find . -name \*.txt -print
En los sistemas que usan GNU find, como la mayoría de las distribuciones de GNU / Linux, puede omitir la impresión.
Otros consejos
Use el árbol
, con -f
(ruta completa) y -i
(sin líneas de sangría):
tree -if --noreport .
tree -if --noreport directory/
Luego puede usar grep
para filtrar los que desee.
Si no se encuentra el comando, puede instalarlo:
Escriba el siguiente comando para instalar el comando de árbol en RHEL / CentOS y Fedora Linux:
# yum install tree -y
Si está utilizando Debian / Ubuntu, Mint Linux escriba el siguiente comando en su terminal:
$ sudo apt-get install tree -y
Pruebe find
. Puede buscarlo exactamente en la página del manual, pero es así:
find [directorio de inicio] -name [qué encontrar]
así que para tu ejemplo
debería darte lo que quieres.
Puede usar find en su lugar:
find . -name '*.txt'
Eso hace el truco:
Pero lo hace al "pecar" sin embargo, con el análisis de ls
, que las comunidades GNU y Ghostscript consideran una mala forma.
DIR=your_path
find $DIR | sed 's:""$DIR""::'
'sed' borrará 'your_path' de todos los resultados 'find'. Y recibe en relación con la ruta 'DIR'.
Para obtener los nombres de archivo de ruta completa de los archivos deseados utilizando el comando find, úselo con el comando pwd:
find $(pwd) -name \*.txt -print
Aquí hay un script de Perl:
sub format_lines($)
{
my $refonlines = shift;
my @lines = @{$refonlines};
my $tmppath = "-";
foreach (@lines)
{
next if ( Aquí hay un script de Perl:
ls -LR | perl format_ls-LR.pl
uso:
<*> =~ /^\s+/);
if ( Aquí hay un script de Perl:
<*>
uso:
<*> =~ /(^\w+(\/\w*)*):/)
{
$tmppath = $1 if defined $1;
next;
}
print "$tmppath/ Aquí hay un script de Perl:
<*>
uso:
<*>";
}
}
sub main()
{
my @lines = ();
while (<>)
{
push (@lines, Aquí hay un script de Perl:
<*>
uso:
<*>);
}
format_lines(\@lines);
}
main();
uso:
<*> Podría crear una función de shell, p. en su .zshrc
o .bashrc
:
filepath() {
echo $PWD/$1
}
filepath2() {
for i in $@; do
echo $PWD/$i
done
}
El primero solo funcionaría en archivos individuales, obviamente.
Busque el archivo llamado " nombre de archivo " en su sistema de archivos comenzando la búsqueda desde el directorio raíz " / " ;. El " nombre de archivo "
find / -name "filename"
Si desea preservar los detalles, incluya ls como tamaño de archivo, etc. en su salida, entonces esto debería funcionar.
sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
Puede implementar esta funcionalidad de esta manera
En primer lugar, el uso del comando ls apuntó al directorio de destino. Más tarde, usando el comando find, filtra el resultado de él
Desde su caso, parece que siempre el nombre del archivo comienza con una palabra
file***.txt
ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search)
En el fish , puede hacer esto para enumerar todos los archivos PDF de forma recursiva, incluidos los del directorio actual :
$ ls **pdf
Simplemente elimine 'pdf' si desea archivos de cualquier tipo.