【问题标题】:copy entire directory excluding a file复制整个目录,不包括文件
【发布时间】:2020-09-22 20:52:34
【问题描述】:

我们知道,cp -r source_dir expected_new_directory 会创建一个具有新名称的源目录副本。现在我想做同样的事情,但想排除一个特定的文件。我在这里找到了一些相关的答案,使用 tarrsync,但在这些解决方案中,我需要先创建目标目录(使用 mkdir)。
老实说,我搜索了很多,但没有找到我想要的。
到目前为止,我得到的最好的是:

tar -c --exclude=\*.dll --exclude=\*.exe sourceDir | tar -x -C destDir

(来自http://www.linuxquestions.org/questions/programming-9/how-to-copy-an-entire-directory-structure-except-certain-files-385321/

【问题讨论】:

    标签: linux cp


    【解决方案1】:

    如果你有 binutils,你可以使用find 过滤下一个cpio 来复制(并创建目录):

    find <sourceDir>  \( ! -name *.dll \) -a \( ! -name *.exe \) | cpio -dumpv <destDir>
    

    【讨论】:

      【解决方案2】:

      尝试使用 'grep -v' 排除文件 ->

      cp `ls | grep -v <exclude-file>` <dest-dir>
      

      【讨论】:

      • 这不会复制子目录。您需要相应地修改命令。
      • 对不起,看不懂命令。我应该把源目录放在哪里?
      • 这里@dganesh2002 将所有文件从当前 目录复制到目标目录。如果没有子目录,文件名没有空格,当前目录下的文件数不太大,就OK。
      • 非常感谢 dganesh2002 和 @atycnth。虽然我仍然需要自己创建 dest_dir,但我喜欢这个解决方案,因为它的机制很简单,而且我很容易记住它。
      【解决方案3】:

      如果目录不是很大,我以前会这样写:

      src=path/to/source/directory
      dst=path/to/destination/directory
      find $src -type f | while read f ; do mkdir -p "$dst/`dirname $f`"; cp "$f" "$dst/$f" ; done
      

      这里我们列出$src中的所有常规文件,遍历这个列表,如果每个文件在$dst中不存在(-p选项mkdir),然后复制文件到那个目录。

      上述命令将复制所有文件。最后,只需使用

      find $src -type f | grep -v whatever | while ...... # same as above  
      

      过滤掉您不需要的文件(例如\.bak$\.orig$ 或您不想复制的任何文件)。

      【讨论】:

        【解决方案4】:

        将所有排除文件移动到主目录或其他目录,将包含所有剩余文件的目录复制到目标文件夹,然后恢复所有排除文件。

        #cd mydirectory
        #mv exclude1 exclude2 /home/
        #cp mydirectory destination_folder/
        #cd /home/
        #mv eclude1 exclude2 mydirectory/
        

        【讨论】:

          猜你喜欢
          • 2013-04-23
          • 1970-01-01
          • 1970-01-01
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多