2

У меня есть папка 'foo', которая содержит много подпапок, например

foo
 |---20101
 |---20102
 |---20103
 |---20111
 |---20112
 |---20113

Есть намного больше, чем это, но, надеюсь, это объясняет сценарий. Теперь я хочу скопировать все папки из этой папки, которые начинаются с «2011», в «foo», называемый «bar». Тем не менее, «бар» уже содержит несколько папок с тем же именем

bar
 |---20111
 |---20113
 |---20114

Содержимое исходной и целевой папок должно быть объединено. Обратите внимание, что сценарию также нужно будет создать папку bar/20112, поскольку она не существует.

Я новичок в скриптах Mac Terminal и успешно смог найти нужные папки

foo>ls | grep ^2011 

Который перечисляет правильные папки, но я не знаю, как передать это к соответствующей операции копирования.

1 ответ1

7

Команда копирования - cp . Если вы зададите ему флаг -r (рекурсивный), он будет делать именно то, что вы хотите, он будет копировать файлы в существующие папки и создавать новые папки, когда папка назначения отсутствует.

Однако вы никогда не должны анализировать вывод ls, вы должны использовать find или, что еще проще, bash globbing:

cp -rv foo/2011* bar/

Если есть файлы, а также папки, чье имя начинается с 2011 , используйте команду find и ее параметр -exec который будет применять любую команду, которую вы ей дадите, ко всему, что найдено командой find (называемой {}):

find foo/ -type d -name "2011*" -exec cp -rv '{}' bar/ \;

В этом конкретном случае нет причин сохранять выходные данные команды и передавать их в cp . Это иногда необходимо, хотя вот как это делается. Как правило, выходные данные команды могут быть переданы в качестве входных данных для другой команды, если они помещены в кавычки или $() .

cp -rv `find foo/ -type d -name "2011*"` bar/

или же

cp -rv $(find foo/ -type d -name "2011*") bar/

Кроме того, вы можете просмотреть результаты:

for dir in $(find foo/ -type d -name "2011*"); do cp -rv "$dir" bar/; done

Это усложняется, если имена ваших файлов / папок могут содержать специальные символы или новые строки и т. П., В этом случае вы должны сделать что-то вроде этого:

find foo/ -type d -name "2011*" | while IFS= read -r dir; do 
       cp -rv "$dir" bar/; 
done

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