Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将文件移动到当前位置的父目录_Linux_Shell_Mv - Fatal编程技术网

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 {} ../. \;