Если я понимаю, что вам нужно, это способ просмотреть папку и все подпапки этой папки и скопировать все найденные файлы в другую папку "назначения", не создавая подпапки в папке "назначения".
Так что если у вас есть такой набор файлов:
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
Если это не совсем то, что вам нужно, дайте мне знать, и я еще раз посмотрю на это.