De opdracht find gebruiken in bash-script

Ik begin net bash-script te gebruiken en ik moet de opdracht find gebruiken met meer dan één bestandstype.

list=$(find /home/user/Desktop -name '*.pdf') 

deze code werkt voor het pdf-type, maar ik wil meer dan één bestandstype zoals .txt of .bmp samen doorzoeken.Heb je enig idee?


Antwoord 1, autoriteit 100%

Welkom bij bash. Het is een oud, donker en mysterieus ding, in staat tot grote magie. 🙂

De optie waar je naar vraagt is echter voor het findcommando, niet voor bash. Vanaf je opdrachtregel kun je man findom de opties te zien.

Degene die je zoekt is -ovoor “of”:

 list="$(find /home/user/Desktop -name '*.bmp' -o -name '*.txt')"

Dat gezegd hebbende … Doe dit niet.Opslag zoals deze kan werken voor eenvoudige bestandsnamen, maar zodra je te maken krijgt met speciale tekens, zoals spaties en nieuwe regels, alle weddenschappen zijn uitgeschakeld. Zie ParsingLsvoor details.

$ touch 'one.txt' 'two three.txt' 'foo.bmp'
$ list="$(find . -name \*.txt -o -name \*.bmp -type f)"
$ for file in $list; do if [ ! -f "$file" ]; then echo "MISSING: $file"; fi; done
MISSING: ./two
MISSING: three.txt

Padnaamuitbreiding (globbing) biedt een veel betere/veiligere manier om bestanden bij te houden. Dan kun je ook bash-arrays gebruiken:

$ a=( *.txt *.bmp )
$ declare -p a
declare -a a=([0]="one.txt" [1]="two three.txt" [2]="foo.bmp")
$ for file in "${a[@]}"; do ls -l "$file"; done
-rw-r--r--  1 ghoti  staff  0 24 May 16:27 one.txt
-rw-r--r--  1 ghoti  staff  0 24 May 16:27 two three.txt
-rw-r--r--  1 ghoti  staff  0 24 May 16:27 foo.bmp

De Bash FAQbevat tal van andere uitstekende tips over programmeren in bash.


Antwoord 2, autoriteit 27%

Als je wilt herhalen wat je “vindt”, moet je dit gebruiken:

find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
    printf '%s\n' "$file"
done

Bron: https://askubuntu.com/questions/343727 /filenames-with-spaces-breaking-for-loop-find-command


Antwoord 3, autoriteit 9%

U kunt dit gebruiken:

list=$(find /home/user/Desktop -name '*.pdf' -o -name '*.txt' -o -name '*.bmp')

Bovendien wil je misschien ook -inamegebruiken in plaats van -nameom bestanden met de extensie “.PDF” (hoofdletters) op te vangen.

Other episodes