Ik ben een shellscript aan het schrijven dat bestandspaden als invoer gebruikt.
Om deze reden moet ik recursieve bestandslijsten met volledige paden genereren. Het bestand bar
heeft bijvoorbeeld het pad:
/home/ken/foo/bar
maar, voor zover ik kan zien, geven zowel ls
als find
alleen relatieve padlijsten:
./foo/bar (from the folder ken)
Het lijkt een voor de hand liggende vereiste, maar ik kan niets zien in de man-pagina’s find
of ls
.
Hoe kan ik een lijst met bestanden in de shell genereren, inclusief hun absolute paden?
Antwoord 1, autoriteit 100%
Als je find
een absoluut pad geeft om mee te beginnen, zal het absolute paden afdrukken. Om bijvoorbeeld alle .htaccess-bestanden in de huidige map te vinden:
find "$(pwd)" -name .htaccess
of als je shell $PWD
uitbreidt naar de huidige map:
find "$PWD" -name .htaccess
find
voegt gewoon het pad toe aan een relatief pad naar het bestand vanaf dat pad.
Greg Hewgillstelde ook voor om pwd -P
te gebruiken als je symlinks wilt oplossen in uw huidige directory.
Antwoord 2, autoriteit 60%
readlink -f filename
geeft het volledige absolute pad. maar als het bestand een symbolische link is, krijg je de uiteindelijke naam.
Antwoord 3, autoriteit 40%
Gebruik dit voor dirs (de /
na **
is nodig in bash om het te beperken tot mappen):
ls -d -1 "$PWD/"**/
dit voor bestanden en mappen direct onder de huidige map, waarvan de namen een .
:
ls -d -1 "$PWD/"*.*
dit voor alles:
ls -d -1 "$PWD/"**/*
Vanaf hier genomen
http://www.zsh.org/mla/users/2002/msg00033.html
In bash is **
recursief als je shopt -s globstar
inschakelt.
Antwoord 4, autoriteit 12%
U kunt
. gebruiken
find $PWD
in bash
Antwoord 5, autoriteit 8%
ls -d "$PWD/"*
Dit kijkt alleen in de huidigedirectory. Het citeert “$PWD” voor het geval het spaties bevat.
Antwoord 6, autoriteit 3%
Opdracht:ls -1 -d "$PWD/"*
Dit geeft de absolute paden van het bestand zoals hieronder.
[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
Antwoord 7, autoriteit 2%
De $PWD
is een goede optie van Matthew hierboven. Als u wilt zoeken om alleen bestanden af te drukken, kunt u ook de optie -type f toevoegen om alleen normale bestanden te zoeken. Andere opties zijn “d” voor alleen mappen enz. Dus in jouw geval zou het zijn (als ik alleen naar bestanden met .c ext wil zoeken):
find $PWD -type f -name "*.c"
of als je alle bestanden wilt:
find $PWD -type f
Opmerking: je kunt geen alias maken voor de bovenstaande opdracht, omdat $PWD automatisch wordt aangevuld in je thuismap wanneer de alias wordt ingesteld door bash.
Antwoord 8, autoriteit 2%
Als je het find-commando een absoluut pad geeft, zal het de resultaten uitspugen met een absoluut pad. Dus, uit de Ken-directory als je zou typen:
find /home/ken/foo/ -name bar -print
(in plaats van het relatieve pad find . -name bar -print
)
Je zou moeten krijgen:
/home/ken/foo/bar
Daarom, als je een ls -l
wilt en het het absolute pad wilt laten retourneren, kun je het find commando gewoon vertellen om een ls -l
uit te voeren op wat het ook is vondsten.
find /home/ken/foo -name bar -exec ls -l {} ;\
OPMERKING: er is een spatie tussen {}
en ;
Je krijgt zoiets als dit:
-rw-r--r-- 1 ken admin 181 Jan 27 15:49 /home/ken/foo/bar
Als u niet zeker weet waar het bestand zich bevindt, kunt u altijd de zoeklocatie wijzigen. Zolang het zoekpad begint met “/”, krijg je een absoluut pad terug. Als u een locatie zoekt (zoals /) waar u veel fouten met geweigerde toestemmingen krijgt, raad ik u aan de standaardfout om te leiden, zodat u de zoekresultaten daadwerkelijk kunt zien:
find / -name bar -exec ls -l {} ;\ 2> /dev/null
(2>
is de syntaxis voor de Borne- en Bash-shells, maar werkt niet met de C-shell. Het kan ook in andere shells werken, maar ik weet alleen zeker dat het werkt in Bourne en Bash).
Antwoord 9
fd
Gebruik fd
(alternatief voor find
), gebruik de volgende syntaxis:
fd . foo -a
Waarbij .
het zoekpatroon is en foo
de hoofdmap is.
Bijvoorbeeld om alle bestanden in etc
recursief weer te geven, voer je uit: fd . /etc -a
.
-a
,--absolute-path
Toon absolute in plaats van relatieve paden
Antwoord 10
Gewoon een alternatief voor
ls -d "$PWD/"*
om aan te geven dat *
shell-uitbreiding is, dus
echo "$PWD/"*
zou hetzelfde doen (het nadeel dat u -1
niet kunt gebruiken om te scheiden door nieuwe regels, niet door spaties).
Antwoord 11
Als u een lijst met alle bestanden in huidige en submappen nodig heeft
find $PWD -type f
Als u alleen een lijst met alle bestanden in de huidige map nodig heeft
find $PWD -maxdepth 1 -type f
Antwoord 12
Probeer dit:
find $PWD/
Je krijgt een lijst met absolute padenin de werkmap.
Antwoord 13
Je kunt doen
ls -1 |xargs realpath
Als u een absoluut pad of relatief pad moet opgeven, kunt u dat ook doen
ls -1 $FILEPATH |xargs realpath
Antwoord 14
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
Antwoord 15
Hier is een voorbeeld dat een lijst afdrukt zonder een extra punt en dat ook laat zien hoe te zoeken naar een bestandsovereenkomst. Ik hoop dat dit helpt:
find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
Antwoord 16
Dit werkte voor mij. Maar het stond niet in alfabetische volgorde.
find "$(pwd)" -maxdepth 1
Dit commando geeft een alfabetische lijst en ook verborgen bestanden.
ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;
Antwoord 17
stat
Absoluut pad van een enkel bestand:
stat -c %n "$PWD"/foo/bar
Antwoord 18
Misschien wil je dit proberen.
for name in /home/ken/foo/bar/*
do
echo $name
done
Je kunt het abs-pad krijgen met de for
-lus en echo
gewoon zonder find
.
Antwoord 19
Dit geeft het canonieke pad (lost symbolische links op): realpath FILENAME
Als je een canoniek pad naar de symbolische link zelf wilt, dan: realpath -s FILENAME
Antwoord 20
De meeste, zo niet alle voorgestelde methoden resulteren in paden die niet rechtstreeks in een ander terminalcommando kunnen worden gebruikt als het pad spaties bevat. Idealiter worden er schuine strepen aan de resultaten toegevoegd.
Dit werkt voor mij op macOS:
find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1 | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'
Antwoord 21
Recursieve bestanden kunnen in Linux op vele manieren worden weergegeven. Hier deel ik een voeringscript om alle logbestanden van bestanden (alleen bestanden) uit de /var/log/
-directory te wissen en ten tweede om recentelijk te controleren welk logbestand een invoer heeft gemaakt.
Eerst:
find /var/log/ -type f #listing file recursively
Tweede:
for i in $(find $PWD -type f) ; do cat /dev/null > "$i" ; done #empty files recursively
Derde gebruik:
ls -ltr $(find /var/log/ -type f ) # listing file used in recent
Opmerking: voor de locatie van de directory kunt u ook $PWD
doorgeven in plaats van /var/log
.
Antwoord 22
Als je geen symbolische links hebt, kun je het proberen
tree -iFL 1 [DIR]
-i
maakt boomafdrukbestandsnamen in elke regel, zonder de boomstructuur.
-f
laat tree het volledige pad van elk bestand afdrukken.
-L 1
voorkomt recursie van de boom.
Antwoord 23
vind jar-bestand recursief en druk absoluut pad af
`ls -R |grep "\.jar$" | xargs readlink -f`
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ojdbc8-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ons-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/oraclepki-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/osdt_cert-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/osdt_core-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/simplefan-19.3.0.0.jar
/opt/tool/dev/maven_repo/com/oracle/ojdbc/ucp-19.3.0.0.jar
Antwoord 24
find / -print
zal dit doen
Antwoord 25
ls -1 | awk -vpath=$PWD/ '{print path$1}'