LINUX.ORG.RU

работа в bash


0

2

есть каталог, более 1500 файлов
есть выборка нужных файлов 500 шт(list), имя каждого файла на новой строке, столбиком получилось
необходимо скопировать выборку в отдельный каталог
---------
извиняюсь, но всё так сложно, что мозг взрывается... помогите срочно надо(как всегда)
только не отправляйте на чтение манов

имя каждого файла на новой строке

Что это значит?
просто использовать маску со звёздочками
cp /dir/*files* /dest_dr
где будут копироваться все файлы, имеющие в своем названии сочетание букв «files»
ну и так далее

darkshvein ☆☆ ()

Имена файлов в файлике записаны?

Я бы так сделал:

for file in `cat list.txt`;
do cp /path/to/source/dir/$file /path/to/target/dir/;
done

Можно одной строкой.

Frakhtan-teh ★★ ()

А если в файлике не только имена файлов но и пути к ним, то еще проще:

for file in `cat list.txt`;
do cp $file /path/to/target/dir/;
done

Frakhtan-teh ★★ ()

М... не учел, что они могут быть с пробелами, тогда как-нибудь так:

for file in `cat list.txt`;
do cp «$file» /path/to/target/dir/;
done

Обрати внимание, что первое вхождение кавычек - это backticks, а не одинарные кавычки.

Frakhtan-teh ★★ ()
Ответ на: комментарий от lorman

отсортируй через ls|grep
там же добавляй это дело постепенно в файл
ls|grep mask1 >>file.list
ls|grep mask2 >>file.list
ls|grep mask3 >>file.list
Потом копируй
cat file.list|cp /dest_dir

darkshvein ☆☆ ()
Ответ на: комментарий от Frakhtan-teh

Не, так тоже работать не будет, если в файле-источнике пробелы не экранированы. Тогда можно IFS поправить:

IFS='
';
for file in `cat list.txt`;
do cp "$file" /path/to/target/dir/;
done

Так сработает, только что протестировал.

Frakhtan-teh ★★ ()

есть выборка нужных файлов 500 шт(list), имя каждого файла на новой строке, столбиком получилось

необходимо скопировать выборку в отдельный каталог

такое после find получается? Да?

cat file_list.txt | xargs mv -t TARGET_DIR
drBatty ★★ ()
Ответ на: комментарий от Frakhtan-teh

Не, так тоже работать не будет, если в файле-источнике пробелы не экранированы. Тогда можно IFS поправить:

можно. А можно так:

while read file; do
#...
done < file_list.txt
drBatty ★★ ()
Ответ на: комментарий от anonymous

дёргать cp на каждый файл тормозно, так думаю будет быстрее:

1. 500 файлов могут и не влезть в командную строку.

2. xargs не дёргает по одному, а обрабатывает сколько влезет.

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

Мм... в смысле - проигнорить регистр? Привести все к нижнему, привести все к верхнему или у нас копируются два файла с одинаковыми именами и и нужно чтобы скопировались оба?

Frakhtan-teh ★★ ()
Ответ на: комментарий от lorman

имена файлов и имена в листе различаются, нужно отредактировать файл так.
{вставка 1} имя файла {вставка 2}

lorman ()
Ответ на: комментарий от Frakhtan-teh

А не будет. Это я сгоряча.

Проще будет сам файл с именами конвертнуть в правильный регистр. Особенно, если нужный регистр заранее известен.

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

А если правильный регистр неизвестен?
Искать правильные файлики файндом и составлять правильный список?

for file in `cat file.txt`; do find /somewhere/ -type f -iname $file; done | tee file_correct.txt

Frakhtan-teh ★★ ()
Ответ на: комментарий от schizoid

ну или так, так тоже можно, если только в копируемых файлах регистр не менять

lorman ()
Ответ на: комментарий от anonymous

то же самое, пробелы

Ну тогда можно `cat list` заменить на `sed s/\ /\\\\\ /g < list`
Будет добавлено экранирование пробелов.

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

PS: да, ещё про xargs правильно выше написали.

imul ★★★★★ ()
Ответ на: комментарий от Frakhtan-teh

Как-то так. На каждую задачу - своё решение.

Кстати, tar же может читать список файлов из stdin:

 tr '[:upper:]' '[:lower:]' <"$LIST_FILE" | tar -cOT - | tar -xC "$DEST_DIR"
schizoid ★★★ ()
Ответ на: комментарий от anonymous

пробелы? ну поставьте в конце каждой строки \000, и юзайте xargs -0

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

да в файлике, но регистр букв нужно проигнорировать, как сделать?

можно проигнорировать регистр букв в файлике (подразумевая, что на диске все буквы малые)

sed 's/.*/\L&/'

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

спасибо, за предложения.
----
ОМГ, сколько волшебных команд и ключей(как коды к кодовым замкам)
регистр я поменял в libreoffice=( только не обижайтесь, ваши примеры я буду по-очереди разбирать.
---
теперь нужно вставки сделать в файле списке он называется у меня просто list
вставка будет такой
{100}имя файла{.gif}
отредактировать файл-list нужно

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