Linux 将文件移动到当前位置的父目录
我有很多文件夹,里面有一个文件夹,里面有文件。我想将第二级文件移动到第一级,这样做时不知道它们的名称 简单的例子:Linux 将文件移动到当前位置的父目录,linux,shell,mv,Linux,Shell,Mv,我有很多文件夹,里面有一个文件夹,里面有文件。我想将第二级文件移动到第一级,这样做时不知道它们的名称 简单的例子: 在运行脚本之前: /temp/1stlevel/test.txt /temp/1stlevel/2ndlevel/test.rtf /temp/1stlevel/test.txt /temp/1stlevel/test.rtf 运行脚本后: /temp/1stlevel/test.txt /temp/1stlevel/2ndlevel/test.rtf /temp/1st
- 在运行脚本之前:
/temp/1stlevel/test.txt /temp/1stlevel/2ndlevel/test.rtf
/temp/1stlevel/test.txt /temp/1stlevel/test.rtf
- 运行脚本后:
/temp/1stlevel/test.txt /temp/1stlevel/2ndlevel/test.rtf
/temp/1stlevel/test.txt /temp/1stlevel/test.rtf
find . -mindepth 3 -type f -exec sh -c 'mv -i "$1" "${1%/*}"' sh {} \;
这就是我得到的:
mv: './1stlevel/2ndlevel/test.rtf' and './1stlevel/2ndlevel/test.rtf' are the same file
有什么建议吗
更新:乔治,这是很棒的东西,谢谢!我学到了很多,并且做了笔记。使用mv
命令而不是更复杂的命令是明智的。这可不是我第一次被指责以最艰难的方式做事了
然而,虽然它可以很好地处理一组文件夹,但如果我有更多的文件夹,它就不能像预期的那样工作。我的意思是:
之前:
new
└── temp
├── Folder1
│ ├── SubFolder1
│ │ └── SubTest1.txt
│ └── Test1.txt
├── Folder2
│ ├── SubFolder2
│ │ └── SubTest2.txt
│ └── Test2.txt
└── Folder3
├── SubFolder3
│ └── SubTest3.txt
└── Test3.txt
之后:
new
└── temp
└── Folder3
├── Folder1
│ ├── SubFolder1
│ └── Test1.txt
├── Folder2
│ ├── SubFolder2
│ └── Test2.txt
├── SubFolder3
├── SubTest1.txt
├── SubTest2.txt
├── SubTest3.txt
└── Test3.txt
期望的:
new
└── temp
├── Folder1
│ ├── SubFolder1
│ ├── SubTest1.txt
│ └── Test1.txt
├── Folder2
│ ├── SubFolder2
│ ├── SubTest2.txt
│ └── Test2.txt
└── Folder3
├── SubFolder3
├── SubTest3.txt
└── Test3.txt
如果有人想变得花哨*:
new
└── temp
├── Folder1
│ ├── SubTest1.txt
│ └── Test1.txt
├── Folder2
│ ├── SubTest2.txt
│ └── Test2.txt
└── Folder3
├── SubTest3.txt
└── Test3.txt
- 不过,我不需要太花哨,因为在我的脚本后面,我只是删除空文件夹
mv YOUR-FILE-NAME ../
如果你有写权限的话,我可以用这个例子来说明: 树结构:
new
└── temp
└── 1stlevel
├── 2ndlevel
│ └── text.rtf
└── test.txt
new
├── move.sh
└── temp
├── folder1
│ ├── subfolder1
│ │ └── subtext1.txt
│ └── test1.txt
├── folder2
│ ├── subfolder2
│ │ └── subtext2.txt
│ └── test1.txt
└── folder3
├── subfolder3
│ └── subtext3.txt
└── test1.txt
以下列方式移动:
find . -mindepth 4 -type f -exec mv {} ./*/* \;
移动后的结果:
new
└── temp
└── 1stlevel
├── 2ndlevel
├── test.txt
└── text.rtf
当您从matters运行它时,我从temp
文件夹的一个文件夹运行,如果您想从temp
文件夹运行它,那么命令将是:
find 1stlevel/ -mindepth 2 -type f -exec mv {} ./* \;
或:
请仔细查看“查找”。/-mindepth 3”部分,记住-mindepth 1表示处理除起点以外的所有文件。因此,如果您从temp
开始,并且在temp/1st/2nd/
中查找一个文件,那么您将从temp开始使用-mindepth 3
访问该文件。请参阅:man find
现在,对于我使用的目的地,/*/*
,解释“从当前目录(从temp开始,我的是新目录)到temp
,然后是1stlevel
,因此:
/
:=>新建文件夹
/*
:=>新建/temp文件夹
/*/*
:=>新建/temp/1stlevel
但是find
命令的全部功能是,但另一个技巧是仅从new
文件夹中使用mv
命令:
mv ./*/*/*/* ./*/*
mv ./*/*/* ./*
这是从我的示例中的新文件夹运行的(换句话说,从一个文件夹到临时文件夹)。进行调整以在不同级别运行它
要从temp
文件夹运行:
mv ./*/*/*/* ./*/*
mv ./*/*/* ./*
如果自您提到您有很多文件以来,您的时间已接近极限,则mv
选项优于find
选项。请仅查看三个文件的时间结果:
查找:
mv:
更新:
由于OP需要一个脚本来访问多个文件夹,因此我附带了以下内容:
!/usr/bin/env bash
对于i in./*/*/*;
做
如果[-d“$i”];
然后
#将文件移动到新位置
mv“$i”/*”${i%/*}/”
#删除空目录
rm-rf“$i”
fi
完成
如何:从新文件夹运行:/move.sh
,记住使用chmod+x move.sh
使脚本可执行。
目标目录结构:
new
└── temp
└── 1stlevel
├── 2ndlevel
│ └── text.rtf
└── test.txt
new
├── move.sh
└── temp
├── folder1
│ ├── subfolder1
│ │ └── subtext1.txt
│ └── test1.txt
├── folder2
│ ├── subfolder2
│ │ └── subtext2.txt
│ └── test1.txt
└── folder3
├── subfolder3
│ └── subtext3.txt
└── test1.txt
获得奇特的结果:
new
├── move.sh
└── temp
├── folder1
│ ├── subtext1.txt
│ └── text1.txt
├── folder2
│ ├── subtext2.txt
│ └── text2.txt
└── folder3
├── subtext3.txt
└── text3.txt
您的find.-mindepth 3-type f-exec sh-c'mv-i“$1”“${1%/*}”sh{}\;
这种尝试很接近于正确
调试复杂命令时的一种有用技术
插入echo
语句以查看发生了什么
所以,如果我们说
这非常有意义-它可以在深度3(及以上)找到所有文件,
剥离路径名的最后一层,并将文件移动到那里
但是
它使用。
从子文件夹1
上升到文件夹1
:
mv -i ./Folder1/SubFolder1/SubTest1.txt ./Folder1/SubFolder1/..
mv -i ./Folder2/SubFolder2/SubTest2.txt ./Folder2/SubFolder2/..
mv -i ./Folder3/SubFolder3/SubTest3.txt ./Folder3/SubFolder3/..
我认为这是一种糟糕的风格,尽管我不知道为什么
我宁愿
$ find . -mindepth 3 -type f -exec sh -c 'mv -i "$1" "${1%/*/*}"' sh {} \;
它使用%/*/*
从文件的路径名中删除两个组件
为了得到你真正想要的
mv -i ./Folder1/SubFolder1/SubTest1.txt ./Folder1
mv -i ./Folder2/SubFolder2/SubTest2.txt ./Folder2
mv -i ./Folder3/SubFolder3/SubTest3.txt ./Folder3
然后您可以使用
$ find . -mindepth 2 -type d –delete
要删除空的子文件夹
目录
如果由于某些故障,其中任何一个不是空的,
find
将不处理它,并发出警告消息。让脚本导航到需要将文件“向上”移动的每个目录,然后让find
查找目录中的每个文件,然后将其向上移动一个目录:
$ find . -type f -exec mv {} ../. \;
确实,你的问题标题引起了我的注意:)Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎离题了,因为它不是关于编程或开发的。请参阅帮助中心。也许或者是一个更好的问题地方。@jww。这是一个非常清楚地提出的问题,有大量的f所做的努力。你认为它离题的唯一可能原因是OP选择了bash作为他们的脚本语言。你会投票结束关于Python的同一个问题吗?@MadPhysicast-这个标准比大头钉高一点“。。。剧本”他回答了一个问题。假设仍然有效,这只是一个如何运行find
和mv
命令的问题。@jww。我不同意。这显然是一个关于如何以一种非常特殊、描述清晰的方式移动文件的问题。显然,如果您使用bash,mv
会在某个时候出现,而find
恰好是OP尝试的一部分。但是正如发布的答案所示,可以使用bash编程语言的一个特性,而不使用find
。这绝对是一个编程问题,即使它根本不是在脚本中发生的,也是一个问题。好吧,第五次是魅力所在!对于所有添加/删除评论,我深表歉意。这个系统对我不好!哈哈,我已经用我的回复编辑了我的帖子。谢谢由于耽搁,工作妨碍了工作
$ find . -type f -exec mv {} ../. \;