Van egy egyszerű szkriptem, amelyet a legtöbb értek, ez a keresési parancs, amely nem világos. Sok dokumentációm van, de ez nem szolgál sokkal világosabbá tételhez. Úgy gondolom, hogy for-loop-ként működik, a jelenleg talált fájlt a (z) {} címre cserélik, és a $ HOME / $ dir_name helyre másolják, de hogyan működik a keresés a -path és -szilvás -o munka? Bosszantó, hogy ilyen konkrét és releváns dokumentációval rendelkezem, és még mindig nem tudom, mi folyik itt.

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

Ez csak az a dokumentáció, amelyet tudnom kell tudja ezt kitalálni.

-path pattern

A fájlnév megegyezik a shell mintázatával. A metakarakterek nem kezelik külön a / vagy a . t; így például találja meg. -path “./sr*sc” kinyomtatja a ./src/misc nevű könyvtár bejegyzését (ha van). Egy teljes könyvtárfa figyelmen kívül hagyásához használja a -prune parancsot, és ne ellenőrizze a fa minden fájlját. Például a src / emacs könyvtár, valamint az alatta lévő összes fájl és könyvtár átugrásához és a többi megtalált fájl nevének kinyomtatásához tegye a következőket:

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

A (z) Findutils kézikönyvből

– Művelet: -exec parancs; Az -execdir művelet ezen nem biztonságos változatát a POSIX határozza meg. A fő különbség az, hogy a parancsot abban a könyvtárban hajtják végre, ahonnan a find -t meghívták, ami azt jelenti, hogy a {} egy relatív elérési útra bővül, amely az egyik kezdő könyvtárak, nem csak az egyező fájl alapneve.

Míg a find egyes megvalósításai csak ott helyettesítik a {} t, ahol megjelenik egy argumentumban a GNU find helyettesíti a {} t, bárhol is jelenik meg.

És

Például az aktuális könyvtárban vagy alatt található C fejlécfájlok összehasonlításához a / tmp / master fájlhoz:

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

Megjegyzések

  • A (z) find: az aszalt szilva nem hagyja figyelmen kívül a megadott elérési utat
  • azt hiszem, ha valami ‘ átmásolja a find-path magyarázatot akkor is, ha a find: prune válasz nem hagyja figyelmen kívül a megadott oldalt Az ath nak van egy válasza, amely látszólag erre a kérdésre vonatkozik. Lehet, hogy a keresési út magyarázata válaszok értelmet nyernek a szkriptek készítésében jártasabb személyek számára, de ezek nem ‘ nem segítenek. Az itt található válaszok eddig értelmesebbek voltak számomra, annak ellenére, hogy ‘ még csak most kezdem őket vizsgálni.

Válasz

-path pontosan úgy működik, mint a -name, de a mintát a a vizsgált fájl teljes elérési útja, az utolsó összetevő helyett.

-prune megtiltja, hogy a talált fájl alatt csökkenjen, ha könyvtárról van szó.

Az egészet összerakva a

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; 
  1. parancs a $HOME.
  2. Ha egy olyan fájlt talál, amely megfelel a $HOME/$dir_name fájlnak, akkor “nem megy alatta (az alkönyvtárat” metszi “).
  3. Egyébként (-o) ha egy *$file_suffix fájlnak megfelelő fájlt talál, átmásolja a következőbe: $HOME/$dir_name/.

Az ötlet úgy tűnik, hogy készítsen biztonsági másolatot az $HOME egyes tartalmairól egy alkönyvtárban $HOME. Az -prune betűvel rendelkező részek nyilvánvalóan szükségesek a biztonsági másolatok készítésének elkerülése érdekében …

Megjegyzések

  • Ha megértem: a keresés iterál a $ HOME minden egyes könyvtárában, ahová engedéllyel rendelkezik, kivéve a $ HOME / $ dir_name nevet, amelybe nem ereszkedik le (mert a metszési művelet igaznak és vagy nem készítjük el), $ file_suffix végződésű fájlokat keres. Aztán amint talál egyet, végrehajtja a cp ” found_file.sh ” parancsot a $ HOME / $ dir_name? Ezenkívül a -path lehetővé teszi a fájl elérési útját, és hasznos, ha azt szeretné, hogy könyvtárakba ereszkedjen, és ne csak az aktuális könyvtárban dolgozzon?
  • Megértése szinte helyes. A -path éppen úgy működik, mint a -name: fájlokat választ. A különbség az, hogy a -name egy mintát illeszt a fájlnévhez, míg a -path egy mintát a teljes elérési névhez. A find mindig alkönyvtárakba ereszkedik, hacsak -maxdepth vagy -prune stb. li megakadályozza. >
  • Ó!A -path-ot akkor alkalmazzák a $ HOME / $ dir_name -prune fájlra, ez ‘ a sorrendet rendezi, ami engem elrontott, és a -path szükséges a prune parancshoz, mert meg kell egyeznie a metszett könyvtár teljes elérési útjával.
  • @Darren I ‘ nem vagyok biztos benne, hogy ez a ‘ s egészen pontos. A -path $HOME/$dir_name egy művelet. Ez egy teszt, amely ellenőrzi, hogy az aktuálisan vizsgált fájl elérési útja megegyezik-e a $HOME/$dir_name bármelyikével. Az -prune külön művelet. Úgy gondolom, hogy első megjegyzésed első mondata pontosan tükrözi ennek működését.
  • Hiányozna valami, ha pipának tekintenéd? Cseréltem a -prune -ot a print-el, és azt hiszem, hogy az áramlás most már tiszta: keresse meg a $ HOME | -t -path $ HOME / $ dir_name | -print

Válasz

A find parancs része, az -exec utasítás.

Lehetővé teszi a find parancs által talált fájl / könyvtár használatát.

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

find $HOME azt jelenti, hogy fájlokat / könyvtárakat keres a $ HOME-ban

A -path <some_path> megértéséhez lásd: div id = “51dfc3a8cf”>

`keresési út magyarázata

Az -prune megértéséhez lásd: https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o jelentése VAGY, tehát -path <some_path> VAGY -name *$file_suffix

-exec a parancs végrehajtását jelenti.

cp {} $HOME/$dir_name/ másolja a $HOME/$dir_name/

\; fájlnak megfelelő fájlokat szüntesse meg a -exec parancsot

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük