Linux将递归复制文件复制到其父文件夹

时间:2014-10-12 12:35:20

标签: linux bash

我想将递归文件复制到其父文件夹以获取特定的文件扩展名。例如:

./folderA/folder1/*.txt to ./folderA/*.txt  
./folderB/folder2/*.txt to ./folderB/*.txt

我检查了cpfind命令,但无法使其正常工作。

3 个答案:

答案 0 :(得分:4)

我怀疑,当你说 copy 时,你实际上是指文件移动到各自的父目录。可以使用find

轻松完成
$ find . -name '*.txt' -type f -execdir mv -n '{}' ../ \;

上面的命令会递归到当前目录.,然后将以下级联条件应用于找到的每个项目:

  1. -name '*.txt'只过滤掉.txt扩展名
  2. 的文件
  3. -type f将仅过滤掉常规文件(例如,不是出于任何原因的目录,其名称恰好以.txt结尾)
  4. -execdir mv -n '{}' ../ \;在包含目录中执行命令mv -n '{}' ../ ,其中{}是匹配文件名称的占位符,需要单引号才能停止解释花括号的shell。 ;终止命令,并且必须再次从shell解析它。
  5. 我已将-n标记传递给mv程序,以避免意外覆盖现有文件。

    以上命令将转换以下文件系统树

    dir1/
        dir11/
            file3.txt
            file4.txt
        dir12/
        file2.txt
    dir2/
        dir21/
            file6.dat
        dir22/
            dir221/
            dir221/file8.txt
            file7.txt
        file5.txt
    dir3/
        file9.dat
    file1.txt
    

    进入这一个:

    dir1/
        dir11/
        dir12/
        file3.txt
        file4.txt
    dir2/
        dir21/
            file6.dat
        dir22/
            dir221/
            file8.txt
        file7.txt
    dir3/
        file9.dat
    file2.txt
    file5.txt
    

    要删除空目录,请运行

    $ find . -type d -empty -delete
    

    同样,此命令将遍历当前目录.,然后应用以下内容:

    1. -type d这次只筛选出目录
    2. -empty仅过滤掉那些空的
    3. -delete删除它们。
    4. 精细打印: -execdir未指定POSIX,但主要实现(至少GNU和BSD)支持它。如果您需要严格的POSIX合规性,则必须使用安全性较低的-exec,在这种情况下需要额外考虑正确使用。

      最后,请在测试目录中尝试使用虚拟文件而不是实际数据的命令。特别是使用-delete的{​​{1}}选项,您可以比您的成像速度更快地丢失所有数据。阅读the man page,如果还不够,请find find。如果您不理解,请不要盲目地复制互联网上发布的随机陌生人的shell命令。

答案 1 :(得分:1)

$cp ./folderA/folder1/*.txt ./folderA

尝试此命令

答案 2 :(得分:0)

从root(ish)目录运行类似的东西:

#! /bin/bash
BASE_DIR=./

new_dir() {
LOC_DIR=`pwd`
for i in "${LOC_DIR}"/*; do
    [[ -f "${i}" ]] && cp "${i}" ../
    [[ -d "${i}" ]] && cd "${i}" && new_dir
cd ..
done
return 0
}

new_dir

这将搜索每个目录。遇到文件时,会将文件复制到目录中。找到目录后,它将向下移动到目录中并再次启动该过程。我认为这对你有用。

祝你好运。