我正在尝试递归复制包含.csv
扩展名的文件的文件夹,并在将它们复制到单个文件夹时重命名它们。
除了我无法理解的文件重命名之外,我已经很接近了。
有人可以帮忙吗?
find "/IMPORTS/EFHG2" -iname '*.csv*' -exec cp {} /temp/Template \;
至于重命名,我正在寻找能够提供文件来源父文件夹的一些指示的内容。
- 原来的 (
file1.csv
,file2.csv
) - 修改的 (
dir1.file1.csv
,dir2.file1.csv
)
答案1
具有以下结构:
├── destdir
└── srcdir
├── dir1
│ └── with space.csv
├── dir2
│ └── infile.csv
└── dir3
└── otherfile.Csv
运行命令:
find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '
path="${1%/*}"; filename="${1##*/}";
echo cp -nv "${1}" "/path/to/destdir/${path##*/}.${filename}" ' sh_cp {} \;
将产生以下输出(在干模式下运行):
cp -v /path/to/srcdir/dir2/infile.csv /path/to/destdir/dir2.infile.csv
cp -v /path/to/srcdir/dir1/with space.csv /path/to/destdir/dir1.file with space.csv
cp -v /path/to/srcdir/dir3/otherfile.Csv /path/to/destdir/dir3.otherfile.Csv
如果我们删除命令echo
前面的cp
(用于干运行)以获取复制和重命名情感,您将得到以下结构:
├── destdir
│ ├── dir1.with space.csv
│ ├── dir2.infile.csv
│ └── dir3.otherfile.Csv
└── srcdir
├── dir1
│ └── with space.csv
├── dir2
│ └── infile.csv
└── dir3
└── otherfile.Csv
请注意,如果子目录中存在相同的文件名和相同的父目录名称,它将用该find
命令找到的最新文件覆盖,这就是为什么我使用-n
该cp
命令来防止这种情况,所以它不会复制相同的文件,请注意这一点。
解释:
find "/path/to/srcdir" -type f -iname '*.csv' -exec sh -c '...' sh_cp {} \;
.csv
递归地查找带有后缀(忽略大小写)的文件,并为每个我们命名的-exec
文件使用内联脚本;这sh
sh -c '...'
sh_cp
{}
是 的替代文件路径find 命令找到它,然后我们传递给我们的脚本,并且可以通过$1
或${1}
参数访问它。
${1%/*}
:从参数中删除最短后缀${1}
(已知Shell 参数扩展),正如上面所说的${1}
是文件路径这样我们就放弃了文件名+ 最后/
从文件路径并只保留小路并存储在path
变量中。${1} --> /path/to/srcdir/dir2/infile.csv ${1%/*} --> /path/to/srcdir/dir2
${1##*/}
:从参数中删除最长的前缀${1}
;这样我们就删除了小路来自文件路径并只保留文件名并存储在filename
变量中。${1} --> /path/to/srcdir/dir2/infile.csv ${1##*/} --> infile.csv
并据此:
path --> /path/to/srcdir/dir2 ${path##*/} --> dir2 ${filename} --> infile.csv ${path##*/}.${filename} --> dir2.infile.csv
尖端:
xYz='to-test/path/to/srcdir/dir2/infile.csv'
${xYz%/*} --> to-test/path/to/srcdir/dir2
${xYz%%/*} --> to-test
${xYz#*/} --> path/to/srcdir/dir2/infile.csv
${xYz#*/} --> infile.csv