Копирование файлов в конвейере с использованием шеллскрипта cygwin bash

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

ибо я в cat boardsdo ls -t $work |grep ^$i |cp .............

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

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

2 ответа

Похоже, вы охотитесь за 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.

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

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

Похоже, вы хотите, чтобы все файлы в /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 {} скопировать каталоги, соответствующие шаблону поиска).

Другие вопросы по тегам