Вы должны использовать BASH?А как насчет Perl или Kornshell?Проблема здесь в том, что Bash не имеет массивов с хэш-ключами (Kornshell и Perl делают).Это означает, что нет простого способа отследить, куда и куда идут файлы.Представьте себе в Perl:
my %directoryB; #Hash that contains files to move to Directory B
my %directoryC; #Hash that contains files to move to Directory C
open (TEXT_FILE_B, "textFileB") or die qq(Can't open "textFileB");
while (my $line = <TEXT_FILE_B>) {
chomp $line;
$directoryB{$line} = 1;
}
close TEXT_FILE_B;
open (TEXT_FILE_C, "textFileC") or die qq(Can't open "textFileC");
while (my $line = <TEXT_FILE_C>) {
chomp $line;
$directoryC{$line} = 1;
}
close TEXT_FILE_C;
Приведенные выше строки создают два хэша.Один для файлов, которые нужно переместить в каталог B, и один для файлов, которые нужно переместить в каталог C. Теперь все, что мне нужно сделать, это посмотреть на мой хэш и решить:
foreach my $file (@directory) { #A little cheating here...
if (exists $directoryB{$file}) {
move ($file, $directoryB);
} elsif (exists $directoryC{$file}) {
move ($file, $directoryC)
}
My ifТеперь операторы могут посмотреть, был ли определен ключ в этом хэше.Если это так, я знаю, что файл можно переместить в этот каталог.Мне нужно прочитать два текстовых файла только один раз.После этого мои два хэша будут хранить, какие файлы перемещаются в один каталог, а какие - в другой.
Однако у нас нет хэшей, поэтому мы будем использовать grep
, чтобы увидеть,Имя файла находится в каталоге.Я предполагаю, что у вас есть одно имя файла в каждой строке.
ls | while read file
do
if grep -q "^${file}$" textFileB
then
mv $file $directoryB
elif grep -q "^${file}$" textFileC
then
mv $file $directoryC
fi
done
grep -q
будет искать ваши два текстовых файла, чтобы увидеть, есть ли соответствующий файл.Если это так, он переместит файл в этот каталог.Это не очень эффективно, поскольку каждый раз приходится искать по всему текстовому файлу.Тем не менее, это довольно эффективно, и вы говорите только о 10000 файлов, поэтому вся операция займет всего несколько минут.