2

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

для i в cat boards сделать ls -t $ work | grep ^ $ i | cp .............

Если я запускаю только с помощью grep, он перечисляет все файлы, которые я хочу, но я не знаю, как получить это на cp cmnd.

Давным-давно я делал все это, но, похоже, помнил, что существует автоматическая переменная, содержащая входные данные из stdin. Любая помощь приветствуется.

2 ответа2

1

Я предполагаю, что вы хотите, чтобы все скопированные файлы оказались в одном месте.

Похоже, вы хотите, чтобы все файлы в /path /to /$ работали, где имя файла начинается со строки из файла board, которая будет скопирована в какой-либо пункт назначения.

например, дано

$ cat boards
start1
start2
$ ls $work
start1.txt
start1.jpg
start2.txt
start2.jpg
start3.txt
$

Вы хотите, чтобы start1.txt, start1.jpg, start2.txt и start2.jpg были скопированы куда-либо, но не start3.txt.

Не используйте xargs: это фантастический инструмент, но он будет вызывать проблемы, если в любом из ваших файлов или "шаблонов поиска" будут пробелы или символы глобуса (например, «*»).

Скорее используйте инструмент, который ожидает шаблон поиска, найти.

cat boards | while read pattern
find $work -name "${pattern}*" -exec cp {} /path/to/destination +
done

Это будет читать в каждой строке boards как шаблон поиска. find затем заглянет в каталог $work чтобы найти файлы (и папки!) которые соответствуют ${pattern}* ; каждый найденный элемент (файл или папка) будет передан в cp как правильно экранированный параметр (в месте {} ), и он будет выполнять xargs минимизацию числа процессов cp он запускает из-за + (если вы Если вы хотите использовать только один процесс для каждого найденного элемента, вы должны использовать его ;

find имеет богатый набор фильтров, которые вы можете применить, чтобы сузить область поиска. Особого внимания заслуживает опция -type f которая ограничивает результаты в файле.

Обратите внимание, что команда cp может завершиться неудачно, если в списке аргументов переданы команды find из папок; использование фильтра -type f предотвратит это.

Также обратите внимание, что команда cp "сгладит" выходной каталог - если в $work есть подкаталоги, в которых совпадают файлы, эти файлы будут скопированы прямо в /path/to/destination . Если вы хотите копировать файлы только на верхнем уровне $work , фильтр -maxdepth (вероятно, со значением 1: -maxdepth 1) предотвратит повторное find поиска в глубине файловой системы.

Обратите внимание, что при find учитывается регистр. Если вы этого не хотите, вы можете использовать -iname вместо -name для поиска без учета регистра.

Если есть какие-либо другие параметры командной строки, которые вы хотите передать cp , просто поместите их перед {} (например, cp -r {} чтобы скопировать каталоги, которые соответствуют шаблону поиска).

1

Похоже, вы охотитесь за Xargs.

destination="/path/to/folder"
for i in $(cat boards)
do 
     ls -t $work | grep ^$i | xargs -Isource cp source /path/to/destination
done

Запустите цикл for используя переменную i заполненную результатами работы с cat boards ($() порождает процесс).

xargs -Isource принимает вывод grep ^$i и передает его в cp в source позиции cp source /path/to/destination . Со страницы руководства:

-I replace-str Replace occurrences of replace-str in the initial-arguments with names read from standard input.

Надеюсь, это было то, что вы искали.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .