Скопировать/вставить код цикла

Я являюсь новым в Linux, таким образом, вот мой очень простой вопрос. У меня есть каталог с 41 папкой. Я должен создать цикл так, чтобы процесс вошел в каждую папку, скопируйте все файлы и затем вставьте все в определенной папке.

Какая-либо идея, как приблизиться к этому? Это было бы большое нажатие без решения для кода

В изображении Вы видите все папки, к которым я должен получить доступ и выходная папка, где я хочу вставить все (zPASTE_EVERYTHING_HERE)

Directory

Мой путь: /shared/home/data/output

Хотел бы вставить все в: /shared/home/data/output/zPASTE_EVERYTHING_HERE

4
задан 30 October 2017 в 08:32

2 ответа

Предположение, что:

  • Папки, которые будут скопированы и их файлы, находятся под /home/gcgm/myfolders
  • Выходная папка /tmp/output-folder

Если необходимо скопировать все файлы в другую папку, можно сделать следующее:

mkdir /tmp/output-folder
cd /home/gcgm/myfolders
cp */* /tmp/output-folder

Значение */* in the this commandCP / цель':

  • Возьмите все файлы (2-е *) во всех каталогах (первое *) под текущим каталогом.
5
ответ дан 23 November 2019 в 11:42

На основе Вашего примера Ваш целевой каталог не содержит цифры, тогда как все Ваши исходные каталоги делают. Так, можно просто использовать (GNU) cp как ниже из родительского каталога, в bash:

shopt -s dotglob  #Enables matching hidden files with glob patterns
shopt -s globstar #Enables recursive traverse of directories
cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/*
  • cp делает копирование
  • -t zPASTE_EVERYTHING_HERE устанавливает целевой каталог
  • *[[:digit:]]*/**/* каталоги соответствий, содержащие, по крайней мере, цифру, пересекают в них (на любой глубине также) и получают все.

Выполнение всего в подоболочке для сохранения родительской оболочки в целости; из родительского каталога:

( shopt -s dotglob && shopt -s globstar && \
    cp -t zPASTE_EVERYTHING_HERE *[[:digit:]]*/**/* )

Теперь, для любого случайного целевого имени каталога, устанавливает каталог как GLOBIGNORE переменная:

GLOBIGNORE=whatever_destination

Теперь, можно просто сделать:

cp -t whatever_destination */**/*

или можно усилить extglob:

shopt -s extglob #Should be already set on any interactive shell session
cp -t whatever_destination !(whatever_destination)/**/*

Дополнительное примечание:

Существует шанс ARG_MAX быть инициированным, если у Вас есть много файлов/каталогов в исходных каталогах, в этом случае у Вас есть две опции:

  • Используйте a for создайте для итерации по файлам один за другим, это было бы очень медленно, как можно предположить:

    for f in !(whatever_destination)/**/*; do cp -- "$f" whatever_destination/; done
    
  • Использовать find:

    find . -mindepth 1 -maxdepth 1 -type d -not -name whatever_destination \
        -name '*' -exec sh -c 'cp -rt whatever_destination "$1"/*' _ {} \;
    
6
ответ дан 23 November 2019 в 11:42

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

Похожие вопросы: