Я являюсь новым в Linux, таким образом, вот мой очень простой вопрос. У меня есть каталог с 41 папкой. Я должен создать цикл так, чтобы процесс вошел в каждую папку, скопируйте все файлы и затем вставьте все в определенной папке.
Какая-либо идея, как приблизиться к этому? Это было бы большое нажатие без решения для кода
В изображении Вы видите все папки, к которым я должен получить доступ и выходная папка, где я хочу вставить все (zPASTE_EVERYTHING_HERE)
Мой путь: /shared/home/data/output
Хотел бы вставить все в: /shared/home/data/output/zPASTE_EVERYTHING_HERE
Предположение, что:
/home/gcgm/myfolders
/tmp/output-folder
Если необходимо скопировать все файлы в другую папку, можно сделать следующее:
mkdir /tmp/output-folder
cd /home/gcgm/myfolders
cp */* /tmp/output-folder
Значение */* in the this command
CP / цель':
На основе Вашего примера Ваш целевой каталог не содержит цифры, тогда как все Ваши исходные каталоги делают. Так, можно просто использовать (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"/*' _ {} \;