我需要在/ parent下复制所有文件夹(到新位置),但前提是该文件具有123.dat-在这种情况下,我也需要复制该文件夹,但不复制任何其他文件。
这样:
|parent
| |a
| | 123.dat
| | 456.dat
| |b
| | 123.dat
| | 789.dat
| |c
| | 456.dat
| | 789.dat
变成:
|parent
| |a
| | 123.dat
| |b
| | 123.dat
我该如何在Linux中执行此操作?这个领域不是我的专长,到目前为止,我尝试进行类似搜索的尝试都没有成功。
文件/文件夹结构:
$ find src | sort
src
src/a
src/a/123.dat
src/a/456.dat
src/b
src/b/123.dat
src/b/768.dat
src/c
src/c/456.dat
src/c/768.dat
复制匹配文件,保留相对路径(浅,深度不超过1个文件夹):
命令:
$ (cd src && cp -v --parents */123.dat ../dest)
输出:
a -> ../dest/a
'a/123.dat' -> '../dest/a/123.dat'
b -> ../dest/b
'b/123.dat' -> '../dest/b/123.dat'
(
和时使用了一个子外壳,)
以便在使用时不更改原始工作目录cd
。我不得不进入src
执行前cp
,以不建立src/
在底层目录dest
。替代方法(find
与可调整的深度限制一起使用):
命令:
$ (cd src && find . -maxdepth 2 -type f -name '123.dat' -exec cp -v -t "../dest" --parents {} +)
输出:
./b -> ../dest/./b
'./b/123.dat' -> '../dest/./b/123.dat'
./a -> ../dest/./a
'./a/123.dat' -> '../dest/./a/123.dat'
笔记:
(
和时使用了一个子外壳,)
以便在使用时不更改原始工作目录cd
。我不得不进入src
执行前find
,以不建立src/
在底层目录dest
。-type f
确保仅123.dat
考虑具有名称的文件,而不考虑恰好具有该名称的目录替代方法(使用rsync
,没有深度限制):
命令:
$ rsync -rv --include=123.dat --include='*/' --exclude='*' --prune-empty-dirs src/ dest
输出:
building file list ... done
created directory dest
./
a/
a/123.dat
b/
b/123.dat
sent 205 bytes received 90 bytes 590.00 bytes/sec
total size is 0 speedup is 0.00
再检查一遍:
$ find dest
dest
dest/b
dest/b/123.dat
dest/a
dest/a/123.dat
笔记:
/
的src/
是故意的,因此,只有该文件夹的内容被复制,而不是文件夹本身。--exclude='*'
默认排除所有内容--include='*/
覆盖排除并包括所有文件夹--include='123.dat'
覆盖排除项,并包含名称为“ 123.dat”的文件(和文件夹)--prune-empty-dirs
确保没有创建空文件夹(例如c
)本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句