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/ \;
- parancs a
$HOME
. - Ha egy olyan fájlt talál, amely megfelel a
$HOME/$dir_name
fájlnak, akkor “nem megy alatta (az alkönyvtárat” metszi “). - 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. Afind
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