Jeg har et simpelt script, som jeg forstår mest af, det er findkommandoen, der er uklar. Jeg har en masse dokumentation, men det tjener ikke til at gøre det meget klarere. Min tanke er, at den fungerer som en for-loop, den aktuelt fundne fil byttes ind på {} og kopieres til $ HOME / $ dir_name, men hvordan fungerer søgningen med -sti og -beskær -o arbejde? Det er irriterende at have sådan en specifik og relevant dokumentation og stadig ikke vide, hvad der foregår.
#!/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
Dette er bare den dokumentation, som jeg ved, jeg burde være i stand til at finde ud af dette.
-sti mønster
Filnavn matcher shell mønster mønster. Metategnene behandler ikke / eller . specielt; så find for eksempel. -sti “./sr*sc” udskriver en post til en mappe kaldet ./src/misc (hvis en findes). For at ignorere et helt katalogtræ skal du bruge -prune i stedet for at kontrollere alle filer i træet. For eksempel for at springe biblioteket src / emacs og alle filer og mapper under det over og udskrive navnene på de andre fundne filer skal du gøre noget som dette:
find . -path ./src/emacs -prune -o -print
Fra Findutils manual
– Handling: -exec-kommando; Denne usikre variant af handlingen -execdir er specificeret af POSIX. Hovedforskellen er, at kommandoen udføres i den mappe, hvorfra find blev påberåbt, hvilket betyder, at {} udvides til en relativ sti, der starter med navnet på en af startmapper snarere end blot basenavnet på den matchede fil.
Mens nogle implementeringer af find erstatter {} kun hvor den vises alene i et argument erstatter GNU find {} uanset hvor det vises.
Og
For eksempel at sammenligne hver C-headerfil i eller under den aktuelle mappe med filen / tmp / master:
find . -name "*.h" -execdir diff -u "{}" /tmp/master ";"
Kommentarer
- Mulig duplikat af find: beskær ignorerer ikke angivet sti
- Jeg tror, hvis det ‘ er en duplikat af find-path forklaret selvom svaret ved find: beskær ignorerer ikke specificeret s ath har et svar, der synes at gælde for dette spørgsmål. Måske giver find-path-forklarede svar mening for nogen, der er mere erfarne med scripting, men de hjælper ikke ‘. Svarene, der er her, giver mig mere mening indtil videre, selvom jeg ‘ lige er begyndt at se på dem.
Svar
-path
fungerer nøjagtigt som -name
, men anvender mønsteret på hele stienavnet på den fil, der undersøges, i stedet for til den sidste komponent.
-prune
forbyder at falde ned under den fundne fil, hvis det var en mappe.
Sætter det hele sammen, kommandoen
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
- Begynder at kigge efter filer i
$HOME
. - Hvis den finder en fil, der matcher
$HOME/$dir_name
, vil den ikke gå under den (“beskærer” underkatalogen). - Ellers (
-o
) hvis den finder en fil, der matcher*$file_suffix
kopierer den til$HOME/$dir_name/
.
Idéen ser ud til at tage en sikkerhedskopi af noget af indholdet af $HOME
i en undermappe fortælling om $HOME
. Delene med -prune
er naturligvis nødvendige for at undgå at tage sikkerhedskopier af sikkerhedskopier …
Kommentarer
- Hvis jeg forstår det: find vil gentage gennem hver eneste mappe i $ HOME, at den har tilladelser at gå ind i, undtagen $ HOME / $ dir_name, som den ikke vil falde ned i (fordi beskæringshandlingen evalueres til sand og eller vil ikke blive taget), søger efter filer, der slutter med $ file_suffix. Så snart den finder en, udfører den cp ” found_file.sh ” til $ HOME / $ dir_name? Også -path giver mulighed for en sti til en fil og er nyttig, når du vil finde at komme ned i mapper og ikke bare arbejde i den aktuelle mappe?
- Din forståelse er næsten korrekt.
-path
fungerer ligesom-name
: det vælger filer. Forskellen er, at-name
matcher et mønster til filnavnet, mens-path
matcher et mønster til det fulde stienavn.find
falder altid ned i underkataloger, medmindre det forhindres af-maxdepth
eller-prune
osv. - Åh!-path anvendes på $ HOME / $ dir_name -prune, så er det ‘ rækkefølgen af kommandoer, der ødelagde mig, og -path er nødvendig for beskærekommandoen, fordi den skal matche den fulde sti i den beskærede mappe.
- @Darren I ‘ Jeg er ikke sikker på, om ‘ s ret nøjagtig.
-path $HOME/$dir_name
er en handling. Det er en test, der kontrollerer, om stien til den aktuelle fil, der undersøges, matcher hvad$HOME/$dir_name
er.-prune
er en separat handling. Jeg tror, at den første sætning i din første kommentar nøjagtigt afspejler, hvordan det fungerer. - Ville det mangle noget at se det som et rør? Jeg byttede -beskær med -print og synes strømmen er klar nu: find $ HOME | -sti $ HOME / $ dir_name | -print
Svar
Det er en del af findkommandoen, udsagnet -exec.
Det giver dig mulighed for at interagere med filen / biblioteket, der findes med find
-kommandoen.
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
betyder at finde filer / mapper i $ HOME
For at forstå -path <some_path>
, se `find-sti` forklaret
For at forstå -prune
, se https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh
-o
betyder ELLER, så -path <some_path>
ELLER -name *$file_suffix
-exec
betyder udfør kommandoen.
cp {} $HOME/$dir_name/
kopier filer, der matcher $HOME/$dir_name/
\;
betyder afslut -exec
kommandoen