Как я могу скопировать все файлы, которые находятся в подпапках в одном каталоге, в другой каталог? У меня проблемы с этим, потому что некоторые из конечных файлов находятся в большем количестве папок, чем другие.

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

В настоящее время у меня есть cp -r cs/cs/201 * sp/. все/

Проблема в том, что у меня есть две папки, которые содержат файлы, которые нужно скопировать, которые являются подмножеством 201 * sp/

В настоящее время он копирует все нужные элементы, которых нет в этих двух папках, но затем сам копирует эти папки, когда мне нужно просто скопировать их содержимое.

2 ответа2

0

найти cs/cs/ 201 * sp/ -type f -exec cp {} все / \;

0

Если я понимаю, что вам нужно, это способ просмотреть папку и все подпапки этой папки и скопировать все найденные файлы в другую папку "назначения", не создавая подпапки в папке "назначения".

Так что если у вас есть такой набор файлов:

folderA/file1
folderA/subfolderC/file2
folderA/subfolderC/subD/file3
folderA/subfolderC/subE/file4
folderB/subfolderF/file5
folderB/subfolderG/subH/file6
folderB/subfolderG/subI/file7

И вы копируете файлы в папку "../destfolder". Затем, после того, как файлы скопированы, "../destfolder" будет содержать:

../destfolder/file1
../destfolder/file2
../destfolder/file3
../destfolder/file4
../destfolder/file5
../destfolder/file6
../destfolder/file7

и "../destfolder" будет содержать ни одной из подпапок из "folderA" или "folderB".

Это можно сделать, перейдя в каталог, из которого вы хотите скопировать файлы, а затем запустите его из командной строки:

d="../destfolder";for f in $(find -type f -exec echo {} \;); do b=$(echo $f|sed -r 's!^.*/([^/]+)!\1!'); echo cp -p "$f" "$d/$b" ;done

Перед тем, как вы "запустите" эту команду, вам нужно будет заменить вашу фактическую папку назначения вместо "../destfolder"

Это отобразит список команд cp , но на самом деле не скопирует файлы. Это должно выглядеть так:

cp -p folderA/file1 ../destfolder/file1
cp -p folderA/subfolderC/file2 ../destfolder/file2
cp -p folderA/subfolderC/subD/file3 ../destfolder/file3
cp -p folderA/subfolderC/subE/file4 ../destfolder/file4
cp -p folderB/subfolderF/file5 ../destfolder/file5
cp -p folderB/subfolderG/subH/file6 ../destfolder/file6
cp -p folderB/subfolderG/subI/file7 ../destfolder/file7

Если вы уверены, что правильные файлы будут скопированы, вы можете снова запустить команду, но удалите "echo" из той части команды, которая выглядит как: "echo cp -p..."

Таким образом, команда, которая будет копировать файлы, будет выглядеть так:

d="../destfolder";for f in $(find -type f -exec echo {} \;); do b=$(echo $f|sed -r 's!^.*/([^/]+)!\1!'); cp -p "$f" "$d/$b" ;done

Помните, что перед тем, как вы "запустите" эту команду, вам нужно будет заменить вашу фактическую папку назначения вместо "../destfolder"

Если вы хотите это как скрипт оболочки, это будет выглядеть так:

#!/bin/sh

d="../destfolder"

for f in $(find -type f -exec echo {} \;); do 
    b=$(echo $f|sed -r 's!^.*/([^/]+)!\1!')
    echo cp -p "$f" "$d/$b"
done


Если это не совсем то, что вам нужно, дайте мне знать, и я еще раз посмотрю на это.

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