簡體   English   中英

如何復制已選擇文件的文件夾和子文件夾

[英]How to copy folders and subfolders which have selected files

我有一個結構如下的目錄oridir

.
├── DIRA
│   ├── DIRA1
│   │   └── file2.txt
│   └── DIRA2
│       ├── file1.xls
│       └── file1.txt
└── DIRB
    ├── DIRB1
    │   └── file1.txt
    └── DIRB2
        └── file2.xls

我必須在維護目錄結構的同時復制擴展名為.xls的文件。 所以我需要在newdir文件夾中有以下目錄和文件:

.
├── DIRA
│   └── DIRA2
│       └── file1.xls
└── DIRB
    └── DIRB2
        └── file2.xls

我嘗試了以下命令,但它復制了所有文件和文件夾:

cp -r oridir newdir

查找所需文件可按以下方式完成:

$ find oridir | grep xls$
oridir/DIRB/DIRB2/file2.xls
oridir/DIRA/DIRA2/file1.xls

也如下:

$ find oridir -type f -iname *.xls
./oridir/DIRB/DIRB2/file2.xls
./oridir/DIRA/DIRA2/file1.xls

但是如何創建這些文件夾和復制文件。 如何在 Linux 中使用 `bash' 實現這種選定的目錄創建和復制文件?

編輯:某些文件和目錄名稱中也有空格。

cp 的--parents標志使用 DIRECTORY 下的完整源文件名

例如,如果啟用了遞歸 glob ** ( shopt -s globstar ):

cp --parents origin/**/*.xls target

如果未啟用遞歸 glob,則必須為目錄層次結構的每個級別添加一個通配符:

cp --parents origin/*/*/*.xls target

如果目標目錄是“dest”。

foo.sh

#!/bin/bash
dest=./dest
find . -type f -name "*.xls" | while read f
do
    d=$(dirname "${f}")                                                         
    d="${dest}/${d}"
    mkdir -p "${d}"
    cp "${f}" "${d}"
done

制作目錄和文件。

$ mkdir -p DIRA/DIRA1
$ mkdir -p DIRA/DIRA2
$ mkdir -p DIRB/DIRB1
$ mkdir -p DIRB/DIRB2
$ touch DIRA/DIRA1/file2.txt
$ touch DIRA/DIRA2/file1.xls
$ touch DIRA/DIRA2/file1.txt
$ touch DIRB/DIRB1/file1.txt
$ touch DIRB/DIRB1/file2.xls

結果是

$ find dest
dest
dest/DIRB
dest/DIRB/DIRB1
dest/DIRB/DIRB1/file2.xls
dest/DIRA
dest/DIRA/DIRA2
dest/DIRA/DIRA2/file1.xls

先看 Yuji 的優秀答案,但我認為tar在這里也是一個不錯的選擇:

cd oridir; find . -name "*.xls" | xargs tar c | (cd ../newdir; tar x)

您可能需要根據目錄的精確路徑調整oridir和/或../newdir

可能的改進:這是一個更好的版本,它可以處理名稱中帶有空格(或其他奇怪字符)的文件(和路徑),並且使用tar自己的選項而不是xargscd

cd oridir; find . -print0 -name "*.xls" | tar -c --null -T- | tar -C ../newdir -x

解釋:

-print0--null導致各自的命令僅通過 null (ASCII 0) 字符分隔文件名。

-T-使tar從標准輸入中讀取文件名。

-C導致tar在解壓縮之前cd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM