[英]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
自己的選項而不是xargs
和cd
:
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.