LINUX.ORG.RU

Bash как переместить папки и файлы которых нет в списке


0

1

всем привет, есть ситуация, нужно переместить папки и файлы которых нет в списке move.txt в пример: есть каталог по адресу /var/dist в этой папке куча не пустых и пустых папок и файлов есть текстовый файл с именами папок которые должны остаться на месте: 1 6 12 66 498 qwerty йцукен итд и все добро которое не проходит нейм контроль перемещяются в папку: /var/trash помогите решить, люди добрые :)


переименовать корневую директорию в /var/dist.moved, создать снова /var/dist и по списку вернуть из dist.moved объекты в dist. в dist.moved останутся не прошедшие нейм контроль

sdio ★★★★★
()
Ответ на: комментарий от sdio

не вариант перемещять, папки из списка хранят более 150 гигов документов, картинок... я вообще этот скрипт хочу засунуть в крон и выполнять его раз в неделю. просто есть сетевой ресурс, и у него есть своя структура и не должно быть лишних папок, вот пусть они в треш сваливаются :)

litle
() автор топика
Ответ на: комментарий от litle

Перемещение в пределах одной фс - не длительная операция. Вариант.

Deleted
()

Читать до просветления: http://www.opennet.ru/docs/RUS/bash_scripting_guide/abs-guide-flat.tar.gz . Читать долго, зато потом будешь светиться очень-очень. (Лучший мануал из когда-либо на писаных на какую-либо тему).

По теме:

#!/bin/sh

FROM="/var/dist"
TO="/var/dist2"
EXCLUDE="move.txt"

cd "$FROM"

ls -1 | while read F ; do
  [[ "$F" != "." ]] && continue
  [[ "$F" != ".." ]] && continue
  F2=`cat "$EXCLUDE" | grep "$F"`
  [[ "$F" != "$F2" ]] && echo "mv './$F' '$TO'"
done
Пишу наглаз, так что отлаживай сам. С другой стороны в таком виде оно просто будет выводить команду mv. Если будет работать правильно тогда замени echo на нормальную команду. Принцип, думаю, ты понял.

Kroz ★★★★★
()

Обязательно bash?

Можно сделать как-то так:

import os
dirname='.'
filename='filelist'
for i in list(set(os.listdir(dirname)).difference(open(filename).read().split()): print i

generator ★★★
()
Ответ на: комментарий от ananas

grep-у можно еще и -F добавить, чтобы не заморачиваться с регулярками

ananas ★★★★★
()

Из разряда извращений — tar с опциями ″remove-files″ и ″exclude-from″. Само то для запуска по крону, чтобы каждый раз данный убирались в отдельный архив. Правда, нужно писать список файлов регулярками.

mky ★★★★★
()

rsync

Шаблон защищённых имён файлов:

$ cat ./move.txt 
2.txt
3/3.txt
Генерируем для примера исходные файлы (3d * 5f):
$ for y in `seq 3`; do mkdir -p "/from_dir/${y}"; for x in `seq 5`; do touch "./from_dir/${y}/${x}.txt"; done; done;
Посмотрим на исходные файлы:
$ ls -R 
.:
from_dir  move.txt

./from_dir:
1  2  3
./from_dir/1:
1.txt  2.txt  3.txt  4.txt  5.txt
./from_dir/2:
1.txt  2.txt  3.txt  4.txt  5.txt
./from_dir/3:
1.txt  2.txt  3.txt  4.txt  5.txt
Переносим все файлы, не соответствующие шаблону «move.txt», из «from_dir/» в «to_dir/»:
$ rsync -a --exclude-from=./move.txt --remove-source-files ./from_dir/ ./to_dir/
Результат:
$ ls -R 
.:
from_dir  move.txt  to_dir

./from_dir:
1  2  3
./from_dir/1:
2.txt
./from_dir/2:
2.txt
./from_dir/3:
2.txt  3.txt

./to_dir:
1  2  3
./to_dir/1:
1.txt  3.txt  4.txt  5.txt
./to_dir/2:
1.txt  3.txt  4.txt  5.txt
./to_dir/3:
1.txt  4.txt  5.txt

justAmoment ★★★★★
()
Ответ на: комментарий от jUIGLE4DDdf

всем спасибо за наброски, буду работать ;)

litle
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.