LINUX.ORG.RU

работа в bash


0

2

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



Последнее исправление: lorman (всего исправлений: 1)

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

Что это значит?
просто использовать маску со звёздочками
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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.