Jag har ett enkelt skript som jag förstår mest av, det är sökkommandot som är oklart. Jag har mycket dokumentation men det tjänar inte till att göra det mycket tydligare. Min tanke är att den fungerar som en for-loop, den hittade filen byts in mot {} och kopieras till $ HOME / $ dir_name, men hur gör sökningen med -path och -skära -o arbete? Det är irriterande att ha sådan specifik och relevant dokumentation och fortfarande inte vet vad som händer.

#!/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 

Detta är bara den dokumentation som jag vet att jag borde kunna ta reda på detta från.

-stegsmönster

Filnamnet matchar skalmönster. Metatecknen behandlar inte / eller . särskilt; så, till exempel, hitta. -path ”./sr*sc” kommer att skriva ut en post för en katalog som heter ./src/misc (om en finns). För att ignorera ett helt katalogträd, använd -prune istället för att kontrollera alla filer i trädet. Om du till exempel hoppar över katalogen src / emacs och alla filer och kataloger under den och skriver ut namnen på de andra filer som hittats, gör du något så här:

find . -path ./src/emacs -prune -o -print

Från Findutils manual

– Åtgärd: -exec-kommando; Denna osäkra variant av åtgärden -execdir specificeras av POSIX. Huvudskillnaden är att kommandot körs i katalogen från vilken Sök anropades, vilket innebär att {} expanderas till en relativ sökväg som börjar med namnet på en av starta kataloger, snarare än bara basnamnet på den matchade filen.

Medan vissa implementeringar av hitta ersätter {} bara där den visas ensam i ett argument ersätter GNU hitta {} var det än visas.

Och

Till exempel att jämföra varje C-rubrikfil i eller under den aktuella katalogen med filen / tmp / master:

 find . -name "*.h" -execdir diff -u "{}" /tmp/master ";" 

Kommentarer

  • Möjlig duplikat av hitta: beskära ignorerar inte angiven sökväg
  • Jag tror att om det är ’ en duplikat av sökvägen förklaras även om svaret vid find: beskära inte ignorerar angiven p ath har ett svar som verkar gälla för denna fråga. Kanske är sökvägen förklarade svar vettiga för någon mer erfaren med skript, men de hjälper mig inte ’. Svaren som finns här är mer meningsfulla för mig hittills, även om jag ’ bara börjar titta på dem.

Svar

-path fungerar precis som -name, men tillämpar mönstret på hela sökvägen till den fil som undersöks istället för till den sista komponenten.

-prune förbjuder att falla under den hittade filen, om det var en katalog.

Att lägga ihop allt kommandot

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. Börjar leta efter filer i $HOME.
  2. Om den hittar en fil som matchar $HOME/$dir_name kommer den inte att gå under den (”beskär” underkatalogen).
  3. Annars (-o) om den hittar en fil som matchar *$file_suffix kopierar den till $HOME/$dir_name/.

Idén verkar vara att säkerhetskopiera en del av innehållet i $HOME i en underkatalog historia om $HOME. Delarna med -prune är uppenbarligen nödvändiga för att undvika säkerhetskopior av säkerhetskopior …

Kommentarer

  • Om jag förstår då: find kommer att upprepas genom varje katalog i $ HOME som den har behörighet att gå in på, förutom $ HOME / $ dir_name, som den inte kommer ner i (eftersom beskärningsåtgärden utvärderas till sant och eller tas inte), söker efter filer som slutar med $ file_suffix. Så snart den hittar en, kommer den att köra cp ” found_file.sh ” till $ HOME / $ dir_name? Dessutom möjliggör -path en sökväg till en fil och är användbar när du vill hitta att falla ner i kataloger och inte bara arbeta i den aktuella katalogen?
  • Din förståelse är nästan korrekt. -path fungerar precis som -name: det väljer filer. Skillnaden är att -name matchar ett mönster med filnamnet, medan -path matchar ett mönster till hela sökvägen. find faller alltid ned i underkataloger, såvida det inte förhindras av -maxdepth eller -prune osv.
  • Åh!-path tillämpas på $ HOME / $ dir_name -prune då är det ’ ordningen på kommandon som förstörde mig, och -path är nödvändig för beskärningskommandot eftersom det måste matcha den fullständiga sökvägen till den beskurna katalogen.
  • @Darren I ’ jag är inte säker på att ’ s ganska exakt. -path $HOME/$dir_name är en åtgärd. Det är ett test som kontrollerar om sökvägen för den aktuella filen som undersöks matchar vad som helst $HOME/$dir_name. -prune är en separat åtgärd. Jag tror att första meningen i din första kommentar återspeglar exakt hur det fungerar.
  • Skulle det saknas något att se det som ett rör? Jag bytte -prune med -print och tror att flödet är klart nu: hitta $ HOME | -väg $ HOME / $ dir_name | -print

Svar

Det är en del av sökkommandot, uttalandet -exec.

Det låter dig interagera med filen / katalogen som hittas av kommandot find.

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;

find $HOME betyder att hitta filer / kataloger i $ HOME

För att förstå -path <some_path>, se `find-path` förklaras

För att förstå -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 att kommandot körs.

cp {} $HOME/$dir_name/ kopiera alla filer som matchar $HOME/$dir_name/

\; betyder avsluta -exec kommandot

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *