我试图创建一个shell脚本,将文件从一台计算机(员工的旧计算机)复制到另一台计算机(员工的新计算机)。我知道我可以复制文件,感谢这里有可爱的人,但是我遇到了一个问题 - 如果我要从这个有两个文件的目录开始:< / p>
C:\ Users \ specificuser \ Documents \ Test Folder ....到这个目录...... C:\ Users \用户specificuser \桌面 ...我看到桌面上显示的文件,但是没有创建这些文件所在的文件夹(测试文件夹)。
以下是我使用的复制功能:
#copy function
def dir_copy(srcpath, dstpath):
#if the destination path doesn't exist, create it
if not os.path.exists(dstpath):
os.makedir(dstpath)
#tag each file to the source path to create the file path
for file in os.listdir(srcpath):
srcfile = os.path.join(srcpath, file)
dstfile = os.path.join(dstpath, file)
#if the source file path is a directory, copy the directory
if os.path.isdir(srcfile):
dir_copy(srcfile, dstfile)
else: #if the source file path is just a file, copy the file
shutil.copyfile(srcfile, dstfile)
我知道我需要在目的地上创建目录,我不太确定该怎么做。
编辑:我发现我有一个类型(os.makedir而不是os.mkdir)。我测试了它,它创建了类似它的目录。但是我喜欢它从它开始的位置创建一个级别的目录。例如,在测试文件夹中有子测试文件夹。它创建了子测试文件夹,但不会创建测试文件夹,因为测试文件夹不是dstpath的一部分。这有意义吗?
答案 0 :(得分:2)
您可能需要查看shutil.copytree()。它执行您正在寻找的递归复制功能,包括目录。因此,对于基本的递归副本,您可以运行:
shutil.copytree(srcpath, dstpath)
但是,为了实现将源目录复制到目标目录的目标,在进程中创建目标目录内的源目录,可以使用以下内容:
import os
import shutil
def dir_copy(srcpath, dstdir):
dirname = os.path.basename(srcpath)
dstpath = os.path.join(dstdir, dirname)
shutil.copytree(srcpath, dstpath)
请注意,您的srcpath
最后不得包含斜杠才能生效。此外,加入目标目录和源目录名称的结果必须不存在,否则copytree将失败。
答案 1 :(得分:0)
import shutil
import os
def dir_copy(srcpath, dstpath):
try:
shutil.copytree(srcpath, dstpath)
except shutil.Error as e:
print('Directory not copied. Error: %s' % e)
except OSError as e:
print('Directory not copied. Error: %s' % e)
dir_copy('/home/sergey/test1', '/home/sergey/test2')
答案 2 :(得分:0)
这是文件复制的常见问题...您是打算只复制文件夹的内容还是要复制文件夹本身?复制实用程序通常有一个标志,你也可以。我使用os.makedirs
以便创建任何中间目录。
#copy function
def dir_copy(srcpath, dstpath, include_directory=False):
if include_directory:
dstpath = os.path.join(dstpath, os.path.basename(srcpath))
os.makedirs(dstpath, exist_ok=True)
#tag each file to the source path to create the file path
for file in os.listdir(srcpath):
srcfile = os.path.join(srcpath, file)
dstfile = os.path.join(dstpath, file)
#if the source file path is a directory, copy the directory
if os.path.isdir(srcfile):
dir_copy(srcfile, dstfile)
else: #if the source file path is just a file, copy the file
shutil.copyfile(srcfile, dstfile)
答案 3 :(得分:0)
我使用这个脚本来备份(复制)我的工作文件夹。它将跳过大文件,保留文件夹结构(层次结构)并在目标文件夹不存在时创建它们。
object Destinations {
const val ORDER_ROUTE = "order"
const val ACCOUNT_ROUTE = "account"
const val ITEM_LIST_ROUTE = "itemList"
const val ITEM_DETAIL_ROUTE = "itemDetail"
const val ITEM_DETAIL_ID_KEY = "itemId"
}
class NavigationActions(navController: NavHostController) {
val selectItem: (Long) -> Unit = { itemId: Long ->
navController.navigate("${Destinations.ITEM_DETAIL_ROUTE}/$itemId")
}
val upPress: () -> Unit = {
navController.navigateUp()
}
}
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApp()
}
}
}
@Compose
fun MyApp() {
MyAppTheme {
val navController = rememberNavController()
val tabs = listOf(Destinations.ORDER_ROUTE, Destinations.ACCOUNT_ROUTE)
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE)
Scaffold(
bottomBar = {
BottomNavigation {
tabs.forEach { tab ->
BottomNavigationItem(
icon = { Icons.Filled.Favorite },
label = { Text(tab) },
selected = currentRoute == tab,
onClick = {
navController.navigate(tab) {
popUpTo = navController.graph.startDestination
launchSingleTop = true
}
},
alwaysShowLabel = true,
selectedContentColor = MaterialTheme.colors.secondary,
unselectedContentColor = LocalContentColor.current
)
}
}
}
) {
NavGraph(navController)
}
}
}
@Composable
fun NavGraph(
navController: NavHostController,
startDestination: String = Destinations.ORDER_ROUTE
) {
val actions = remember(navController) { NavigationActions(navController) }
NavHost(navController = navController, startDestination = startDestination) {
navigation(startDestination = Destinations.ITEM_LIST_ROUTE, route = Destinations.ORDER_ROUTE) {
composable(Destinations.ITEM_LIST_ROUTE) {
ItemList(actions.selectItem)
}
composable(
"${Destinations.ITEM_DETAIL_ROUTE}/{$Destinations.ITEM_DETAIL_ID_KEY}",
arguments = listOf(navArgument(Destinations.ITEM_DETAIL_ID_KEY) {
type = NavType.LongType
})
) {
ItemDetail()
}
}
composable(Destinations.ACCOUNT_ROUTE) {
Account()
}
}
}