Nowe posty

Autor Wątek: Skrypt do segregacji bash  (Przeczytany 3084 razy)

bubi503

  • Gość
Skrypt do segregacji bash
« dnia: 2011-07-25, 12:32:57 »
Witam mam problem z napisaniem skryptu, potrzebuje aby wyszukiwał on w danym katalogu plików z rozszerzeniem .txt i .avi a następnie przenosił je do innego katalogu a więc miał by przykładowo wyszukać plików 111.avi i 111.txt a następnie przenieść je do katalogu np. movie
zależy mi na tym aby przenosił tylko jeśli będą te dwa pliki czyli dajmy na to jeśli znajdzie sam 111.avi to ma nic z nim nie robic
natomiast jesli skrypt by wyszukiwał jeszcze plików zawierających w nazwie "PL" i przenosil je do tego samego katalogu to był bym w pełni szczęśliwy (chociaż to akurat umiem napisac).
wymyśliłem taki szkielet (oczywiscie to w nawiasach zmienił bym na mv)
#!/bin/bash

find /home/movie/ -type f -iname \\*.avi | while read -r line ; do
dir=${line%/*}
name=${line##*/}
(
cd /home/bubi/movie/
qnapi "$name"
)
done

był bym wdzięczny za pomoc, oczywiście nie jest to żadna praca domowa

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Skrypt do segregacji bash
« Odpowiedź #1 dnia: 2011-07-25, 13:14:39 »
dir="./1/"
targetdir="./2/"

find "$dir" -type f -iname "*.avi" | while read avi; do
  base=`basename "$avi"`;
  base="${base:0:${#base}-4}"
  find "$dir" -type f -iname "${base}.txt" | while read txt; do
    echo "Moving $avi and $txt"
    mv -f "$avi" "$targetdir"
    mv -f "$txt" "$targetdir"
  done
done
Ja bym dodał jeszcze inne formaty w tym findzie dla txt, np. srt.

Dla PL wystarczy wcześniej wykonać to samo z -iname "*PL*.avi" w pierwszym findzie.

bubi503

  • Gość
Skrypt do segregacji bash
« Odpowiedź #2 dnia: 2011-07-25, 13:46:07 »
Dzieki wielkie działa, tak tylko srt bedzie w pozniejszej fazie ew.
1. rozpakowanie i wyodrebnienie avi
2. skrypt z qnapi --> przenoszenie do innego folderu
3. zmiana napisow na utf8

  • Gość
Skrypt do segregacji bash
« Odpowiedź #3 dnia: 2011-07-30, 01:31:50 »
Cytat: ultr
  base=`basename "$avi"`;
  base="${base:0:${#base}-4}"
#v+
$ man basename
SYNOPSIS
       basename NAME [SUFFIX]
(...)
       basename include/stdio.h .h
              Output "stdio".
#v-
A żeby nie mieć problemów z wielkością znaków, zawsze można wykorzystać bashyzm¹:
base=${base%.*}
¹ — byłem przekonany że to bashyzm, ale konstrukcja ta działa też w dash-u, więc chyba jest bezpieczna.