Odpowiedzi:
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
będzie działać. Może być bardziej elegancki sposób.
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;
nie mają znaczenia : w przeciwnym razie exec ma zastosowanie tylko do ostatniej części ( -iname '*.jpg'
w tym przypadku).
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0
wydrukuje tylko pliki jpg! Potrzebujesz nawiasów tutaj:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
-E
Pozwala uniknąć konieczności ucieczki parens i rur w Twojej regex.
-E
opcja mówi find
o użyciu „rozszerzonych wyrażeń regularnych”. Kilka innych narzędzi ma podobną opcję, ale nie jestem pewien, czy ta opcja jest dostępna we wszystkich dystrybucjach UNIX.
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
.
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
. Użycie -iregex
flagi informuje, find
że wielkość liter nie ma znaczenia.
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
Używa tego file
polecenia, aby spróbować rozpoznać typ pliku, niezależnie od nazwy pliku (lub rozszerzenia).
Jeśli /path/to
lub nazwa pliku zawiera ciąg image
, powyższe może zwrócić fałszywe trafienia. W takim razie sugerowałbym
cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg
, -o -name *.jpeg
, -o -iname *gif
Mają nieco inny format.
w przypadku, gdy pliki nie mają rozszerzenia, możemy poszukać typu MIME pliku
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
gdzie (audio | wideo | matroska | mpeg) są wyrażeniami regularnymi typu MIME
a jeśli chcesz je usunąć:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
lub usuń wszystko inne oprócz tych rozszerzeń:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
zwróć uwagę na! ~ zamiast ~