შიგთავსზე გადასვლა

ფაილების ძებნა — find

მიზანი

ისწავლი ათასობით ფაილს შორის იმის მოძებნას, რაც გჭირდება — სახელით, ზომით, თარიღით — და ნაპოვნზე ბრძანების პირდაპირ გაშვებას.

წინაპირობა: 01 — ბრძანების ველი · დრო: ~40 წუთი


პრობლემა

გაქვს საქაღალდე 1 200 ორთოფოტოთი. გჭირდება მხოლოდ 2024 წლისები, სხვა საქაღალდეში. Windows-ის Explorer-ში ძებნას დაიწყებ, დაელოდები, მერე Ctrl აჭერილი ხელით მონიშნავ 300 ფაილს და ერთი ცდომილი დაწკაპუნება ყველაფერს გააუქმებს.

ლინუქსში ეს ერთი ხაზია. და რაც მთავარია — ის ხაზი შეგიძლია შეინახო და ხვალ ხელახლა გაუშვა 2025 წლის მონაცემებზე.

ცნება

find არ არის „ძებნის ველი". ის არის ფაილების გადამამუშავებელი მილსადენი. ლოგიკა სამნაწილიანია და ყოველთვის ამ თანმიმდევრობითაა:

find  [სად ვეძებოთ]  [რა კრიტერიუმით]  [რა ვუყოთ ნაპოვნს]
find /data/ortho -name "*.tif" -exec gdalinfo {} \;
ნაწილი როლი
/data/ortho სად ვეძებოთ
-name "*.tif" რა კრიტერიუმით
-exec gdalinfo {} \; რა ვუყოთ ნაპოვნს

ყველაზე ხშირი შეცდომა დამწყებთათვის

find რეკურსიულია ნაგულისხმევად — ის შედის ყველა ქვესაქაღალდეში. find / მთელ სისტემას სკანირებს და წუთებს გაგრძელდება. ყოველთვის დაიწყე კონკრეტული საქაღალდიდან, არა /-დან.

ბრძანებები

სად ვეძებოთ

find .              # მიმდინარე საქაღალდე და ყველა ქვესაქაღალდე
find /data/ortho    # კონკრეტული ბილიკი
find . -maxdepth 1  # მხოლოდ მიმდინარე, ქვესაქაღალდეებში არ ჩავიდე

კრიტერიუმები

კრიტერიუმი მნიშვნელობა მაგალითი
-name სახელი (რეგისტრზე მგრძნობიარე) -name "*.shp"
-iname სახელი (რეგისტრის იგნორით) -iname "*.TIF"
-type f მხოლოდ ფაილები
-type d მხოლოდ საქაღალდეები
-size +100M 100 მბ-ზე დიდი + მეტი, - ნაკლები
-mtime -7 ბოლო 7 დღეში შეცვლილი
-empty ცარიელი

ბრჭყალები სავალდებულოა

find . -name *.tif არ იმუშავებს სწორად. ვარსკვლავს shell გახსნის, სანამ find-ს მისცემს. ყოველთვის დაწერე -name "*.tif" — ბრჭყალებში.

კრიტერიუმების შეერთება

# 100 მბ-ზე დიდი TIF ფაილები — ორივე პირობა ერთდროულად (AND ნაგულისხმევია)
find /data -name "*.tif" -size +100M

# TIF ან TIFF (OR)
find /data \( -name "*.tif" -o -name "*.tiff" \)

# ყველაფერი გარდა TIF-ისა
find /data ! -name "*.tif"

რა ვუყოთ ნაპოვნს

find . -name "*.tif" -print            # დაბეჭდე ბილიკი (ნაგულისხმევი)
find . -name "*.tif" -delete           # წაშალე  ⚠️
find . -name "*.tif" -exec ls -lh {} \;   # გაუშვი ბრძანება თითოეულზე

-exec-ში {} არის „ნაპოვნი ფაილის ბილიკი", ხოლო \; ნიშნავს ბრძანების დასასრულს.

ჯერ ნახე, მერე გააკეთე

-delete და -exec შეუქცევადია. ყოველთვის ჯერ უბრალო find-ით ნახე სია:

find /data/ortho -name "*_2024*.tif"        # 1. ნახე რას იპოვის
find /data/ortho -name "*_2024*.tif" -delete # 2. მხოლოდ მერე იმოქმედე

GIS მაგალითი

1 200 ორთოფოტოდან 2024 წლისების გამოცალკევება

# 1. ჯერ დავინახოთ რამდენია
find /data/ortho -name "*_2024*.tif" | wc -l
# 312

# 2. შევქმნათ სამიზნე საქაღალდე
mkdir -p /data/ortho_2024

# 3. გადავიტანოთ
find /data/ortho -name "*_2024*.tif" -exec mv {} /data/ortho_2024/ \;

დისკი გაივსო — ვინ ჭამს ადგილს?

# 500 მბ-ზე დიდი ფაილები, ზომის მიხედვით დალაგებული
find /data -type f -size +500M -exec du -h {} + | sort -rh | head -20

გეოგრაფის დისკს ჩვეულებრივ ორი რამ ავსებს: არაშეკუმშული GeoTIFF-ები და QGIS-ის დროებითი ფაილები. ეს ბრძანება ორივეს პოულობს.

სერიული გადაპროექტება GDAL-ით

# ყველა shapefile WGS84-ში → UTM 38N
find /data/vector -name "*.shp" -exec ogr2ogr -t_srs EPSG:32638 \
    /data/vector_utm/{} {} \;

აი, სწორედ აქ ჩანს განსხვავება. QGIS-ში ამას 40 ფაილზე ერთი საათი დასჭირდება დაწკაპუნებით. აქ — ერთი ბრძანება, რომელიც შენახვადია და გამეორებადი.

მიტოვებული .shp-ის თანმხლები ფაილების პოვნა

Shapefile რეალურად 4–7 ფაილია. ხშირად .shp წაშლილია, .dbf და .shx კი დარჩა:

find /data/vector -name "*.dbf" | while read f; do
    [ -f "${f%.dbf}.shp" ] || echo "ობოლი: $f"
done

ეს უკვე 09 — სკრიპტირების წინასწარი ჩვენებაა.


სავარჯიშო

1. სავარჯიშო მონაცემები

შექმენი სატესტო სტრუქტურა:

mkdir -p ~/lab/ortho/{2023,2024,2025}
cd ~/lab/ortho
touch 2023/tbilisi_2023_01.tif 2023/tbilisi_2023_02.tif
touch 2024/tbilisi_2024_01.tif 2024/rustavi_2024_01.tif 2024/rustavi_2024_02.TIF
touch 2025/batumi_2025_01.tif
touch 2024/notes.txt 2024/tbilisi_2024_01.tfw

2. იპოვე

  • ყველა .tif ფაილი (მხოლოდ ფაილები, არა საქაღალდეები)
  • ყველა .tif და .TIF — ერთი ბრძანებით
  • მხოლოდ ის ფაილები, რომელთა სახელში წერია rustavi
  • ყველაფერი, რაც არ არის .tif
  • მხოლოდ საქაღალდეები

3. იმოქმედე

გადაიტანე ყველა 2024 წლის ფაილი (რეგისტრის იგნორით!) ახალ საქაღალდე ~/lab/ortho_2024/-ში. ჯერ -print-ით შეამოწმე, მერე -exec.

პასუხები
# 2
find . -name "*.tif" -type f
find . \( -iname "*.tif" \)                  # -iname ორივეს იჭერს
find . -name "*rustavi*"
find . -type f ! -name "*.tif"
find . -type d

# 3
mkdir -p ~/lab/ortho_2024
find . -iname "*_2024_*" -type f -print                        # ჯერ ნახე
find . -iname "*_2024_*" -type f -exec mv {} ~/lab/ortho_2024/ \;

შენიშნე?

მე-2 დავალებაში -iname "*.tif" უფრო მარტივია, ვიდრე \( -name "*.tif" -o -name "*.TIF" \). ლინუქსში თითქმის ყოველთვის არსებობს მოკლე გზა — მაგრამ -o მაინც უნდა იცოდე, რადგან განსხვავებული კრიტერიუმების შეერთებისას სხვა გამოსავალი არაა.


გასამახსოვრებელი

find [სად] [კრიტერიუმი] [მოქმედება]
  • ბრჭყალები -name-ზე — ყოველთვის
  • ჯერ -print, მერე -delete / -exec
  • /-დან ძებნა ნელია — დაიწყე კონკრეტული საქაღალდიდან
  • -iname რეგისტრს იგნორირებს, -name არა

დაკავშირებული


სასერტიფიკატო შესაბამისობა

LPIC-1: 103.3 (ფაილების საბაზისო მართვა, წონა 4) · 104.7 (სისტემური ფაილების ძებნა, წონა 2) RHCSA: საბაზისო ინსტრუმენტები

სრული მატრიცა — სასერტიფიკატო ამოცანები