Копирование файлов в конвейере с использованием шеллскрипта cygwin bash
Мне нужно выбрать определенные файлы в каталоге и скопировать их в другой каталог, используя скрипт cygwin, но я не могу получить синтаксис для копии. т.е.
ибо я в cat boards
do
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 {}
скопировать каталоги, соответствующие шаблону поиска).