Ik heb een eenvoudig script dat ik het meeste begrijp, het is het zoekcommando dat onduidelijk is. Ik heb veel documentatie, maar het dient niet om het veel duidelijker te maken. Mijn gedachte is dat het werkt als een for-loop, het momenteel gevonden bestand wordt ingeruild voor {} en gekopieerd naar $ HOME / $ dir_name, maar hoe werkt het zoeken met -path en -prune -o werk? Het is vervelend om over zulke specifieke en relevante documentatie te beschikken en nog steeds niet te weten wat er aan de hand is.
#!/bin/bash # The files will be search on from the user"s home # directory and can only be backed up to a directory # within $HOME read -p "Which file types do you want to backup " file_suffix read -p "Which directory do you want to backup to " dir_name # The next lines creates the directory if it does not exist test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name # The find command will copy files that match the # search criteria ie .sh . The -path, -prune and -o # options are to exclude the backdirectory from the # backup. find $HOME -path $HOME/$dir_name -prune -o \ -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; exit 0
Dit is alleen de documentatie waarvan ik weet dat ik die zou moeten hieruit kunnen achterhalen.
-padpatroon
Bestandsnaam komt overeen met shellpatroonpatroon. De metatekens behandelen / of . niet speciaal; dus zoek bijvoorbeeld. -path “./sr*sc” zal een ingang afdrukken voor een directory genaamd ./src/misc (indien aanwezig). Om een hele mappenboom te negeren, gebruikt u -prune in plaats van elk bestand in de boomstructuur te controleren. Om bijvoorbeeld de map src / emacs en alle bestanden en mappen eronder over te slaan, en de namen van de andere gevonden bestanden af te drukken, doe je iets als dit:
find . -path ./src/emacs -prune -o -print
– Actie: -exec commando; Deze onveilige variant van de -execdir -actie wordt gespecificeerd door POSIX. Het belangrijkste verschil is dat het commando wordt uitgevoerd in de directory van waaruit find werd aangeroepen, wat betekent dat {} wordt uitgebreid naar een relatief pad dat begint met de naam van een van de startmappen, in plaats van alleen de basisnaam van het overeenkomende bestand.
Hoewel sommige implementaties van find de {} alleen vervangen waar het op zichzelf verschijnt in een argument vervangt GNU find {} waar het ook voorkomt.
En
Om bijvoorbeeld elk C-headerbestand in of onder de huidige directory te vergelijken met het bestand / tmp / master:
find . -name "*.h" -execdir diff -u "{}" /tmp/master ";"
Reacties
- Mogelijk duplicaat van find: prune negeert het opgegeven pad niet
- Ik denk dat het ‘ een duplicaat is van vind-pad uitgelegd zelfs als het antwoord op find: prune de gespecificeerde p ath heeft een antwoord dat op deze vraag van toepassing lijkt. Misschien zijn de vind-pad uitgelegd antwoorden logisch voor iemand die meer ervaring heeft met scripting, maar ze ‘ helpen me niet. De antwoorden die hier aanwezig zijn, zijn tot nu toe logischer voor mij, ook al ben ik ‘ net begonnen ze te onderzoeken.
Antwoord
-path
werkt precies zoals -name
, maar past het patroon toe op de volledige padnaam van het bestand dat wordt onderzocht, in plaats van naar de laatste component.
-prune
verbiedt het afdalen onder het gevonden bestand, in het geval dat het een directory was.
Alles bij elkaar opgeteld, het commando
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
- Begint naar bestanden te zoeken in
$HOME
. - Als het een bestand vindt dat overeenkomt met
$HOME/$dir_name
, zal het “er niet onder gaan (” pruimen “de submap). - Anders (
-o
) als het een bestand vindt dat overeenkomt met*$file_suffix
, kopieert het het naar$HOME/$dir_name/
.
Het idee lijkt te zijn om een back-up te maken van een deel van de inhoud van $HOME
in een subdirec tory van $HOME
. De onderdelen met -prune
zijn uiteraard nodig om te voorkomen dat er back-ups van back-ups worden gemaakt …
Opmerkingen
- Als ik het dan begrijp: find zal elke map in $ HOME doorlopen waar het toegang toe heeft, behalve $ HOME / $ dir_name, waar het niet in zal afdalen (omdat de prune-actie evalueert naar true en de of wordt niet gebruikt), zoekend naar bestanden die eindigen op $ file_suffix. Zodra het er een vindt, zal het cp ” found_file.sh ” uitvoeren in $ HOME / $ dir_name? Ook staat -path een pad naar een bestand toe, en is het handig als je wilt zoeken om in mappen af te dalen en niet alleen in de huidige map te werken?
- Je begrip is bijna correct.
-path
werkt net als-name
: het selecteert bestanden. Het verschil is dat-name
een patroon overeenkomt met de bestandsnaam, terwijl-path
een patroon overeenkomt met de volledige padnaam.find
daalt altijd af naar submappen, tenzij dit wordt voorkomen door-maxdepth
of-prune
enz. - Oh!-path wordt toegepast op $ HOME / $ dir_name -prune, het ‘ s de volgorde van de opdrachten die me in de war brachten, en -path is nodig voor het prune-commando omdat het moet overeenkomen met het volledige pad van de opgeschoonde map.
- @Darren Ik ‘ m niet zeker of dat ‘ is vrij nauwkeurig.
-path $HOME/$dir_name
is één actie. Het is een test die controleert of het pad van het huidige bestand dat wordt onderzocht overeenkomt met wat$HOME/$dir_name
is.-prune
is een aparte actie. Ik denk dat de eerste zin van je eerste opmerking nauwkeurig weergeeft hoe dat werkt. - Zou er iets ontbreken om het als een pijp te zien? Ik heb -prune geruild met -print en denk dat de stroom nu duidelijk is: zoek $ HOME | -pad $ HOME / $ dir_name | -print
Answer
Het maakt deel uit van het find-commando, het -exec-statement.
Het stelt je in staat om te communiceren met het bestand / de map die is gevonden met het find
commando.
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
betekent bestanden / mappen zoeken in $ HOME
Om -path <some_path>
te begrijpen, zie `find -path` uitgelegd
Om -prune
te begrijpen, zie https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh
-o
betekent OR, dus -path <some_path>
OF -name *$file_suffix
-exec
betekent voer het commando uit.
cp {} $HOME/$dir_name/
kopieer alle bestanden die overeenkomen met $HOME/$dir_name/
\;
betekent beëindig het -exec
commando